Introduction
This report is an overview of the initial observations and analysis performed on the Food Security Cluster 5Ws data for the first three-quarters of 2021; the issues identified and analysis have been broken into large groups corresponding with the first 4 chapters – analysis by geography, activities and modalities, partners and beneficiaries. This report ends with a brief section on next steps and an interactive reference table and reference map.
We have endeavoured to provide actionable information and believe that releasing this report is a necessary part of jumpstarting the process of resolving the more pressing concerns identified. Further analysis is merited in several areas; and this will be undertaken once consultations with partners have been completed.
Unless otherwise specified, beneficiary figures in this report are the number of unique beneficiaries, as opposed to beneficiary frequencies.
1. Geographical coverage
1.1 Comparing beneficiaries reached and 2021 PIN by state and region
A total of 2,088,142 unique beneficiaries have been reached across the country; this is 75.43% of the targetted 2,768,349 persons; however, not all the beneficiaries reached corresponded to areas where there were targets – this is explored in more detail in the section on townships.

1.2 Table of beneficiaries and PIN by state and region
Beneficiaries reached and PIN by state/region
|
state
|
beneficiaries
|
%_of_ben
|
target
|
%_of_target
|
%_target_reached
|
PIN
|
|
Yangon
|
1,274,906
|
61.27
|
1,777,522
|
64.21
|
71.72
|
1,777,522
|
|
Rakhine
|
430,247
|
20.68
|
487,182
|
17.60
|
88.31
|
632,805
|
|
Kachin
|
87,452
|
4.20
|
86,117
|
3.11
|
101.55
|
102,649
|
|
Shan (North)
|
64,794
|
3.11
|
13,428
|
0.49
|
482.53
|
24,657
|
|
Ayeyarwady
|
55,276
|
2.66
|
0
|
0.00
|
NA
|
0
|
|
Kayin
|
46,932
|
2.26
|
6,855
|
0.25
|
684.64
|
6,855
|
|
Mon
|
43,442
|
2.09
|
0
|
0.00
|
NA
|
0
|
|
Mandalay
|
24,829
|
1.19
|
381,818
|
13.79
|
6.50
|
381,818
|
|
Kayah
|
15,920
|
0.77
|
5,830
|
0.21
|
273.07
|
5,830
|
|
Chin
|
13,550
|
0.65
|
5,106
|
0.18
|
265.37
|
13,275
|
|
Shan (South)
|
9,304
|
0.45
|
1,978
|
0.07
|
470.37
|
2,054
|
|
Sagaing
|
8,090
|
0.39
|
0
|
0.00
|
NA
|
0
|
|
Bago (East)
|
4,312
|
0.21
|
2,513
|
0.09
|
171.59
|
2,513
|
|
Magway
|
1,695
|
0.08
|
0
|
0.00
|
NA
|
0
|
Yangon and Rakhine form both 82% of the target and 82% of the beneficiaries reached. Mandalay has has the largest difference between targets and beneficiaries reached. There were four states (Ayeyarwady, Mon, Sagaing and Magway) where beneficiaries were reached but were not included as part of the 2021 target or PIN; however, the beneficiaries reached in these areas represent less than 5% of all beneficiaries reached. Additionally, targets have been exceeded in 7 states, with Kayin having reached 684% of its target of 6,855 persons.
However, moving forward, the PIN for 2022 is much more evenly spread across the country: with reference to the plot below, Yangon, along with Magway and Mandalay have some of the lowest proportions of vulnerable persons in relation to the total state population, meaning that careful beneficiary selection and tight vulnerability in these areas will necessary to avoid excessive inclusion errors.

1.3 Township-level distribution of beneficiaries
Just as the response is heavily weighted towards Yangon and Rakhine at the state and region level, the same is true at the township level as well. These 10 townships below are where 80% of beneficiaries have been reached collectively, they represent 53% of the 2021 target. In particular, Hlaingtharya has beneficiary figures that are 378% of its target. Additionally, neither Kawareik in Kayin or Kyaikmaraw in Mon were targetted as part of the 2021 PIN despite being in the top 10 townships by beneficiaries reached – only 88.5% of beneficiaries corresponded to townships with targets.
Top 10 townships by beneficiaries reached in 2021
| Hlaingtharya |
Yangon |
772,658 |
37 |
204,542 |
11.29 |
377.8 |
| Dagon Myothit (Seikkan) |
Yangon |
276,430 |
13.24 |
199,242 |
11 |
138.7 |
| Dala |
Yangon |
170,463 |
8.16 |
200,589 |
11.07 |
84.98 |
| Sittwe |
Rakhine |
147,864 |
7.08 |
127,750 |
7.05 |
115.8 |
| Buthidaung |
Rakhine |
106,815 |
5.12 |
121,631 |
6.71 |
87.82 |
| Maungdaw |
Rakhine |
80,348 |
3.85 |
71,360 |
3.94 |
112.6 |
| Pauktaw |
Rakhine |
33,907 |
1.62 |
28,162 |
1.55 |
120.4 |
| Kawkareik |
Kayin |
30,867 |
1.48 |
0 |
0 |
NA |
| Lashio |
Shan (North) |
29,963 |
1.43 |
5.7 |
0 |
525,667 |
| Kyaikmaraw |
Mon |
28,590 |
1.37 |
0 |
0 |
NA |
107 townships have been reached by food security activities in the first three-quarters of 2021. This is less than a third of the 330 townships in the country. It is also important to note that three townships – Hpapun in Kayin, Muse in Shan (North) and Kyethi in Shan (South) have been targetted since the initial 2021 HRP, yet have not been reached by any FSC activities; 10 townships, overall, in either the HRP or IERP, have not benefitted from any FSC activities.
Overall, 66.73% of the targetted population was reached. From the histogram below, we can see that overreach and under-reaching are very common at the township level – townships are commonly clustered at around 0% reached and also at 200% reached or more. Of the 51 townships targetted in 2021; 21 townships reached more than 120% of their target, 4 reached between 100% and 119% of their target; 7 townships reached between 80% and 100% of their target; and 2 townships reached less than 80% of their target.

1.4 Locations
Partners have responded in a total of 1563 locations across the country, with the vast majority of locations only having only one partner operating in them; the maximum number of partners in any location is 3. Of the 5776 rows reported in the 5Ws, only 156 did not report a specific location.
Locations are classified into three groups – camps, industrial zones and villages/towns/wards:
Summary of location types
| village_ward_town |
1,157 |
90 |
1,422,282 |
81.42 |
1,229 |
| camp |
421 |
38 |
316,648 |
18.13 |
752 |
| industrial_zone |
5 |
2 |
7,870 |
0.45 |
1,574 |
The vast majority of locations are served by only one partner. Below are a series of histograms showing the variation in the number of beneficiaries by location, split by number of partners in each location:

The more partners operating in a given location, the higher the average number of beneficiaries; however, it should be noted that these multi-partner locations are comparatively rare:
| one_partner |
1,496 |
182 |
| two_partners |
61 |
676 |
| three_partners |
11 |
859 |
2. Activities and modalities
2.1 Progress by activity

Partners reported their achievements across the eight 5W activities. As note, we see that the majority of the caseload for monthly cash-based transfers was established prior to 2021 (with the number of beneficiaries only increasing very incrementally across the couese of the year) – this aligns with our understanding that many of the projects contributing to this activity were multi-year in nature and had been ongoing prior to the HRP.
One of the difficulties of interpreting these data is that it is not always apparent where the patterns observed are reflective or changes in the field (such as changes in access, funding or staffing) or if they are instead due to partners’ reporting behaviours. We note, for instance, a large jump in the number of beneficiaries for fishery its and food baskets around July 2021 – this was due to the newly-approved addendum to the HRP. However, some of the other changes are less clear and will require careful exploration with partners.
2.2 Delivery modalilties
Cash was the main delivery modality in four out of the eight activities under the Food Security Cluster, followed by “in-kind”, which was predominantly employed in three. However, the in-kind modality has the highest reach, given the especially large beneficiary numbers originating from the provision of monthly food baskets. We also note several misclassifications – small portions of monthly cash transfers have been coded as in-kind and there are in-kind food baskets coded as hybrid. It might also be worth more clearly delineating between “support for income-generating activities” and the “provision of technical training” as service delivery and support are heavily present in both.

63% of beneficiary frequencies received support through the in-kind delivery modality; we use beneficiary frequencies here as there were several instances of modalities changing partway through an intervention: for reference, 85% of beneficiaries were reached initially with in-kind interventions, meaning that there was a tendency to diversify away from in-kind support over 2021. 33% of beneficiary frequencies were reached by cash transfers.
Beneficiary frequencies by delivery modalities and frequency of distribution
| In-kind |
303,595 |
1,222,709 |
407,196 |
1,417,351 |
110,723 |
3,461,574 |
63 |
| Cash |
894 |
1,572,070 |
103,357 |
4,746 |
117,525 |
1,798,592 |
32.74 |
| Hybrid (In-kind & Cash) |
NA |
183,097 |
2,488 |
10,810 |
NA |
196,395 |
3.57 |
| Voucher |
NA |
NA |
2,652 |
16,519 |
NA |
19,171 |
0.35 |
| Service delivery/support |
NA |
4,383 |
9,060 |
4,690 |
NA |
18,133 |
0.33 |
| NA |
NA |
NA |
NA |
423 |
NA |
423 |
0.01 |
| Total |
304,489 |
2,982,259 |
524,753 |
1,454,539 |
228,248 |
5,494,288 |
100 |
Regarding the table above, there is a strong argument to remove the option “other” from the 5W column frequency (referring to frequency of transfer/delivery) – what exactly it connotes is unclear, as partners might elect this option for activities that occur both more and less frequently than every month; there is also the possibility that partners are just electing “other” instead of leaving the column blank. It is possible to backfill some of the “other” values from the beneficiary_recurrency column. This will be explored further in the chapter on beneficiaries.
A key piece of missing information not currently captured by the 5W template is the duration of these activities – the number of months a monthly food basket is provided can only be calculated somewhat reliably with considerable effort. The table below shows the average duration (in months) of the various activities in the frequency category “Monthly”:
Average duration (in months) of monthly activities
| Provide monthly cash-based transfers |
6.205 |
| Provide monthly food baskets |
4.688 |
| Provide technical training |
2.18 |
| Cash for Work / Food for Assets |
1.838 |
| Provide support for income generation |
1 |
2.3 Monetary values of intervention packages per household

The most common transfer values – in terms of beneficiaries reached – are between USD 10 and USD 20, though it should be noted – and can be more clearly seen from the table below, a not insignificant number of beneficiaries (about 8%) were reached by cash transfer interventions valued at more than USD 100 per household. Please note that these monetary values were calculated only from rows with unique beneficiaries so that we are not using the cumulative sums per household.
Cash transfer, hybrid and voucher values per household by frequency of transfer (USD)
| <$10 |
185 |
30,682 |
2,126 |
9,543 |
42,536 |
14.82 |
| >=$10_<$20 |
241 |
122,979 |
8,002 |
502 |
131,724 |
45.9 |
| >=$20_<$40 |
242 |
11,335 |
13,756 |
1,881 |
27,214 |
9.48 |
| >=$40_<$60 |
226 |
29,536 |
12,850 |
188 |
42,800 |
14.91 |
| >=$60_<$100 |
NA |
9,826 |
4,850 |
4,912 |
19,588 |
6.83 |
| >=$100_<$200 |
NA |
413 |
14,255 |
789 |
15,457 |
5.39 |
| >=$200 |
NA |
23 |
7,204 |
438 |
7,665 |
2.67 |
Next, let us take a look at household package values by activity type:

Overall, the highest average cash transfers were from activities providing support for income generation and the lowest averages coming from monthly cash-based transfers (after discounting food baskets, where less than 1% of activities reported the package value).
It would be fruitful to explore the provision of monthly cash-based transfers in more detail – this activity has a very clear peak at >=$10_<$20. A closer look reveals that this is almost entirely due to the 122,854 beneficiaries who received monthly transfers of USD 10.50/month (or MMK 15,000) per household. It is unclear whether this is a data entry error – but what we do know is that the households that received this type of transfer were not abnormally small; it might be possible that be possible that this activity had been conceived as one singular transfer that had been split across several months.
This should be followed up with the 7 partners who provided this transfer value to beneficiary households; they are: Save the Children, WFP, Myanmar Heart Organisation, People for People, Plan International, World Vision Myanmar and Karuna Mission Social Solidarity.
If correct, this amount falls far below the minimum expenditure basket for food identified by the Cash Working Group, which established a floor of MMK 190,555 per household per month. Below is a table which summarises the percentage of the minimum expenditure basket is covered by the different bins we have established for the cash-transfer values:
Monthly cash-based transfer by percentage of MEB received
| <$10 |
4.21 |
5.61 |
32,746 |
14.82 |
| >=$10_<$20 |
7.92 |
10.57 |
122,582 |
55.47 |
| >=$20_<$40 |
25.17 |
33.57 |
16,431 |
7.43 |
| >=$40_<$60 |
34.06 |
45.43 |
28,927 |
13.09 |
| >=$60_<$100 |
53.66 |
71.58 |
15,836 |
7.17 |
| >=$100_<$200 |
79.86 |
106.5 |
4,463 |
2.02 |
| >=$200 |
199.2 |
265.6 |
22 |
0.01 |
Around 9% of beneficiaries of monthly cash-based transfers have received more than 50% of the value of the minimum expenditure basket for food. Notably, 15% of beneficiaries have received less than USD 10 per household per month. This underscores the importance of standardisation: beneficiaries have already received very different package amounts and there is a pressing need to collect information on whether cash transfers (and food baskets) have been designed to be full rations or are instead intended to be supplementary activities. This is key from a coordination standpoint as we cannot consider the food security needs of those who have only received supplementary transfers to have been covered.
3. Partners
Of the 51 partners of the Food Security Cluster, a total of 49 of them classified themselves as implementing partners within the 5Ws. They are fairly evenly split themselves between HRP indicators, with 32 contributing towards food and cash assistance and 29 contributing towards agriculture and other livelihood support. 28 partners have reached less than 10,000 unique beneficiaries and the median unique beneficiaries reached by partners is 4,697. Below are the top 10 partners by HRP indicator. As a side note, Zigway should be considered as a vendor/supplier of WFP, and not the implementing partner – some follow up with WFP will be necessary to rectify this.
Top 10 partners by beneficiaries reached, by HRP indicator
| Open Data Myanmar (ODM) |
304,919 |
|
Center for Social Integrity (CSI) |
28,725 |
| MRCS |
263,005 |
|
Action Contre la Faim |
19,109 |
| Zigway |
223,478 |
|
Action for Green Earth |
16,037 |
| Hlaingthayar Development Network |
189,701 |
|
World Vision Myanmar |
15,303 |
| World Vision Myanmar |
168,698 |
|
Myanmar Heart Development Organization |
9,867 |
| Urban Strength (US) |
128,878 |
|
WFP |
7,691 |
| WFP |
105,984 |
|
Save the Children |
7,543 |
| Hlaingthayar Youth Network |
96,145 |
|
Phyu Sin Saydanar Action Group |
6,052 |
| Action for Green Earth |
67,578 |
|
BRAC Myanmar |
5,162 |
| Myanmar Heart Development Organization |
63,838 |
|
MRCS |
5,051 |
3.1 Distribution of partners by beneficiaries and geographic reach
Whilst there is quite a bit of variation in the number of beneficiaries reached, we can see that partners’ geographic footprints are – on the whole – quite limited. Only 4 partners have a presence in more than 10 townships, with only 10 being present in more than 5 townships. 79% of our partners (clustered along the bottom of the chart) are present in 5 or less townships. This distribution of partners is an impediment to a countrywide response and it is imperative to understand how best to incentivise partners to expand their footprints.
3.2 Map of number of partners and 2022 people in need by state/region
Food Security Cluster partners are not well-positioned to meet the needs of the 2022 population in need. Partners are largely concentrated in Kachin, Rakhine and Yangon, with no partners present in Tanintharyi and Bago (West) and only one partner present in Magway, Bago (East) and Shan (East). The number of partners in Ayeryawady is also quite disproportionate with the number of people in need in that region.
Overall, 71% of townships, containing 62% of the 2022 PIN, do not have any partners present. This lack of nationwide coverage will be one of the most important constraints that the FSC will face in meeting the 2022 needs of vulnerable, food insecure persons and IDPs – and resolving this will necessitate increasing partner coverage and finding new partners the cluster.

3.3 Reporting organisations
There are 58 combinations between reporting organisations and implementing partners, 19 of which are instances where the reporting organisation and the implementing partner are the same organisation; once these are filtered out, all the remaining implementing partners correspond to just 10 reporting organisations:
Number of implementing partners by reporting organisation
| WFP |
21 |
| Save the Children |
4 |
| FAO |
3 |
| Finn Church Aid |
3 |
| Mercy Corps |
2 |
| Trocaire |
2 |
| AVSI |
1 |
| Danish Refugee Council |
1 |
| Helvetas |
1 |
| Oxfam |
1 |
Regarding questions of membership, it would be safe to say that all partners who reported in the 5Ws – be they reporting organisations or implementing partners – in addition to strategic partners and partners who aid in analysis who are not represented in the 5Ws, are FSC partners. However, for this report, we have used implementing_partners for most of the analysis as, by their nature, reporting organisations do not have a field presence. As a side note, FAO has not classified itself as an implementing partner, having reported no activities that were directly implemented by them.
3.4 Types of partners
Average reach by implementing partner type
| INGO |
86,455 |
4.882 |
1.941 |
| NNGO |
89,651 |
3.258 |
1.194 |
| UN |
1,245,381 |
52 |
11 |
There is no real difference between the average numbers of beneficiaries reached by INGOs and NNGOs; however, the geographical reach of INGOs is markedly greater, perhaps due to the much tighter geographical focus of several community-based organisations. There is only one agency in the “UN” category for implementing partner type – WFP.
The only notable thing about the donor column is its incompleteness, which is understandable – only 43% (representing only 10% of all reported beneficiary frequencies) of the rows are filled. Additionally, we also observe a number of errors, including cases where multiple donors have been combined into one row as well as numerous instances where WFP, FAO and UN WOMEN were classified as donors as opposed to reporting organisations. Not much useful analysis can be extracted from this column at present.
4. Beneficiaries
4.1 Beneficiary disaggregations
Currently, in the 5Ws, the vast majority of beneficiary diasaggregations have been backfilled from census data and do not, consequently, provide an accurate picture of the population that have been reached bu Food Security interventions. It is not possible to determine how far reality diverges from what has been reported so far – meaning that we also cannot determine if there has been any bias in beneficiary selection and targetting. It is imperative to begin collecting disaggregated beneficiary data from partners.
It is entirely possible that partners are collecting this data – disaggregated beneficiary data is one of the most common data required for internal and external reporting – and that it is merely necessary to work with partners to wrangle their data into the 5W format. However, the capacities of partners to disaggregate beneficiary data should be investigated by the cluster and is an important issues that should be brought up in te next plenary session.
4.2 Types of beneficiaries
The states and sub-regions in which we are working the most with IDPs are Bago (East), Kachin, Chin, Shan (North) and Kayah. Overall, 75.27% of beneficiaries are from the host/local community, 14.08% are stateless persons from Rakhine and 10.54% are IDPs. Returnees are the rarest type of beneficiary reached, forming only 0.11% of all beneficiaries reached. Each row in the table below shows the percentage of each beneficiary type within each state/region.
Beneficiary types by state/region
|
state
|
Host/local Community
|
Internally Displaced
|
Returnees
|
Rakhine stateless
|
beneficiaries
|
|
Ayeyarwady
|
100.00
|
0.00
|
0.00
|
0.00
|
55,276
|
|
Bago (East)
|
0.00
|
100.00
|
0.00
|
0.00
|
4,312
|
|
Chin
|
9.23
|
90.77
|
0.00
|
0.00
|
13,550
|
|
Kachin
|
6.49
|
91.80
|
1.71
|
0.00
|
87,452
|
|
Kayah
|
45.89
|
54.11
|
0.00
|
0.00
|
15,920
|
|
Kayin
|
89.99
|
10.01
|
0.00
|
0.00
|
46,932
|
|
Magway
|
100.00
|
0.00
|
0.00
|
0.00
|
1,695
|
|
Mandalay
|
100.00
|
0.00
|
0.00
|
0.00
|
24,829
|
|
Mon
|
91.68
|
6.52
|
1.80
|
0.00
|
43,442
|
|
Rakhine
|
19.17
|
12.50
|
0.00
|
68.33
|
430,247
|
|
Sagaing
|
100.00
|
0.00
|
0.00
|
0.00
|
8,090
|
|
Shan (East)
|
100.00
|
0.00
|
0.00
|
0.00
|
510
|
|
Shan (North)
|
25.69
|
74.31
|
0.00
|
0.00
|
71,677
|
|
Shan (South)
|
100.00
|
0.00
|
0.00
|
0.00
|
9,304
|
|
Yangon
|
100.00
|
0.00
|
0.00
|
0.00
|
1,274,906
|
|
Total
|
75.27
|
10.54
|
0.11
|
14.08
|
NA
|
Compared to only the 2021 HRP targets (as the IERP does not have breakdowns of the target by beneficiary type), we can see that whilst targets have been mostly exceeded, neither the targets for returnees/resettled in Kachin or Shan (North) nor targets for IDPs in Rakhine or Kayin have been met. Interestingly, for Rakhine, the targets for the host/local population have been greatly exceeded. In Bago (East), Chin, and particularly Shan (North), the targets for IDPs have been greatly exceeded, in comparison to the 2021 HRP targets:
Percentage of 2021 HRP target reached by beneficiary type
| Bago (East) |
NA |
171.6 |
NA |
NA |
171.6 |
| Chin |
0 |
200.7 |
NA |
NA |
156.9 |
| Kachin |
72.94 |
108.8 |
32.88 |
NA |
101.5 |
| Kayin |
NA |
68.5 |
NA |
NA |
97.4 |
| Rakhine |
185.4 |
32.66 |
NA |
105.8 |
88.31 |
| Shan (North) |
132 |
743 |
0 |
NA |
394.9 |
| Shan (South) |
0 |
NA |
NA |
NA |
0 |
Stateless persons from Rakhine have the largest average household sizes, and the largest variations in household size. The thick bar in the middle of each box shows the average household size for each beneficiary type – this value is also shown in the text label below the line. The lower and upper borders of each box indicate the values for the 25th and 75th percentiles respectively. For instance, we can see that households at the 25th percentile of households in host/local communities have only one member and households that have around 5 members have more members than 75% of all the households in that group. Outliers are marked by dots. We note a lot of potential data entry errors where less than one person per household have been recorded.

4.3 Beneficiaries by activity frequency
The categories “First” and “Monthly” in the frequency column do not seem to be filled as intended, as can be seen from the plot below:

The assumption for these categories is that the first instance of a beneficiary receiving support (as part of a continuing monthly support package) would fall under the category “First” and every subsequent time they received support, it would be under “Monthly”.
But we can see that this is not the case – monthly beneficiaries predated the use of the “First” category by at least four months; furthermore, the spike in first-time beneficiaries in May 2021 was not accompanied by any increase in monthly beneficiaries in the subsequent months – in fact, there was a decline in monthly beneficiaries. Complicating all this is that we are not sure which of the beneficiaries track beneficiaries in a comprehensive manner i.e. with a beneficiary database and beneficiary ID cards. All this indicates that – after confirming this with partners – we should abandon the “First” category and recode these entries as “One-off”.
4.4 Gaps in monthly programming
Number of beneficiaries and locations by duration of gaps in implementation
| 0 |
257 |
33 |
457,591 |
75.39 |
| 1 |
26 |
15 |
54,078 |
8.91 |
| 2 |
94 |
15 |
57,032 |
9.4 |
| 3 |
4 |
4 |
36,648 |
6.04 |
| 4 |
6 |
3 |
277 |
0.05 |
| 5 |
4 |
2 |
1,360 |
0.22 |
75% of beneficiaries experienced no gaps in monthly programming and very long gaps of 4 or 5 months are quite rare; of the beneficiaries who did experience gaps in monthly coverage, most experienced gaps of 1-2 months. The 10 townships which experienced the longest average gaps between “monthly” activities were: Mohnyin, Myitkyina, Hpakant, Mogaung, Chipwi and Waingmaw in Kachin; Shwepyithar in Yangon; Demoso and Loikaw in Kayah; and Kutkai in Shan. Overall, 12 townships in Kachin experienced gaps in the implementation of monthly activities; 6 in Rakhine; 2 each in Ayeyarwady, Kayah and Shan; and 1 in Yangon. It should be explored whether the delays in these areas were due to access issues or other other constraints.
There are 167 entries coded as being implemented on a monthly basis that have not recurred – that is, they have only been implemented once: we should check with partners if these are merely the first instances or if they are errors in data entry or if there have been issues with access, security or funding.
4.5 Potential for post-distribution monitoring
The table below shows activities which have been implemented for 6 months or more, the number of locations they were implemented in and the number of unique beneficiaries reached by activities meeting these criteria. The possibility of joint monitoring – or at least the joint review and analysis of monitoring data – will be explored, in consultation with these partners. The rationale being that 6 months of implementation should be a long enough period of time to make impact monitoring feasible; additionally, joint monitoring will be further facilitated by the similarity of these activities, almost all of which are recurrent cash transfers or distributions of food baskets.
Number of unique beneficiaries which have received at least 6 months of recurrent food security support
| Provide monthly cash-based transfers |
6 |
232 |
183,237 |
| Provide monthly food baskets |
7 |
39 |
141,652 |
| Provide technical training |
1 |
12 |
300 |
The partners which have implemented activities fitting these criteria are WFP, Karuna Mission Social Solidarity, World Vision Myanmar, Myanmar Open Heart Development Organisation, People for People and Plan International for monthly cash transfers; World Vision Myanmar, Myanmar Open Heart Development Organisation, Action for Green Earth, People Hope Community Development (PHCD), Together for Sustainable Development, Karuna Mission Social Solidarity and WFP for monthly food baskets; and the Da-Nu National Affairs Organisation (DNAO) for technical training.
LS0tDQp0aXRsZTogIkluaXRpYWwgcmVwb3J0IG9uIHRoZSBNeWFubWFyIEZvb2QgU2VjdXJpdHkgNVdzIg0KYXV0aG9yOiAiU2VhbiBOZyINCmRhdGU6ICIyMi8wMS8yMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCi0tLQ0KDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQoNCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICIiOw0KICBkaXNwbGF5OiBibG9jazsNCiAgaGVpZ2h0OiA3MHB4Ow0KICBtYXJnaW46IDJlbSAyMHB4IDQwcHggMjBweDsNCiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJNeWFubWFyX2NsdXN0ZXJfYmx1ZS5wbmciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCg0KIyMgSW50cm9kdWN0aW9uDQoNClRoaXMgcmVwb3J0IGlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBpbml0aWFsIG9ic2VydmF0aW9ucyBhbmQgYW5hbHlzaXMgcGVyZm9ybWVkIG9uIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgNVdzIGRhdGEgZm9yIHRoZSBmaXJzdCB0aHJlZS1xdWFydGVycyBvZiAyMDIxOyB0aGUgaXNzdWVzIGlkZW50aWZpZWQgYW5kIGFuYWx5c2lzIGhhdmUgYmVlbiBicm9rZW4gaW50byBsYXJnZSBncm91cHMgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBmaXJzdCA0IGNoYXB0ZXJzIC0tIGFuYWx5c2lzIGJ5IGdlb2dyYXBoeSwgYWN0aXZpdGllcyBhbmQgbW9kYWxpdGllcywgcGFydG5lcnMgYW5kIGJlbmVmaWNpYXJpZXMuIFRoaXMgcmVwb3J0IGVuZHMgd2l0aCBhIGJyaWVmIHNlY3Rpb24gb24gbmV4dCBzdGVwcyBhbmQgYW4gaW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGFuZCByZWZlcmVuY2UgbWFwLiANCg0KV2UgaGF2ZSBlbmRlYXZvdXJlZCB0byBwcm92aWRlIGFjdGlvbmFibGUgaW5mb3JtYXRpb24gYW5kIGJlbGlldmUgdGhhdCByZWxlYXNpbmcgdGhpcyByZXBvcnQgaXMgYSBuZWNlc3NhcnkgcGFydCBvZiBqdW1wc3RhcnRpbmcgdGhlIHByb2Nlc3Mgb2YgcmVzb2x2aW5nIHRoZSBtb3JlIHByZXNzaW5nIGNvbmNlcm5zIGlkZW50aWZpZWQuIEZ1cnRoZXIgYW5hbHlzaXMgaXMgbWVyaXRlZCBpbiBzZXZlcmFsIGFyZWFzOyBhbmQgdGhpcyB3aWxsIGJlIHVuZGVydGFrZW4gb25jZSBjb25zdWx0YXRpb25zIHdpdGggcGFydG5lcnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4gDQoNClVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCBiZW5lZmljaWFyeSBmaWd1cmVzIGluIHRoaXMgcmVwb3J0IGFyZSB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBiZW5lZmljaWFyaWVzLCBhcyBvcHBvc2VkIHRvIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzLiANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShwYW5kZXIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGZ1enp5am9pbikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGJvb2tkb3duKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShnZ3NmbGFiZWwpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEVCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoYWRtaW4xcGNvZGVfNDphZG1pbjNwY29kZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfNCwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluM3Bjb2RlLA0KICAgICAgICAgc3RhdGVfbmFtZSAgID0gc3RhdGVfNSwNCiAgICAgICAgIHRvd25zaGlwX25hbWUgID0gY291bnR5KSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpDQoNCiMgbG9jYXRpb25zIGRhdGFzZXQgDQpsb2NhdGlvbnMgPC0gYmluZF9yb3dzKA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgcGF5YW1zIA0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3Qoc3RhdGVfbmFtZTpwYXlhbV9jb2RlKSAlPiUgDQogICAgcmVuYW1lKGFkbWluMV9wY29kZSA9IHN0YXRlX2NvZGVfMTIsDQogICAgICAgICAgIHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZSwgDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IGNvdW50eV9jb2RlLA0KICAgICAgICAgICBsb2NhdGlvbiA9IHBheWFtX25hbWUpICU+JQ0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgicGF5YW0iKSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBjYW1wcw0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3QoY291bnR5X25hbWUxOnBfY29kZV9jYW1wKSAlPiUgDQogICAgcmVuYW1lKHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZTEsDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IHN0YXRlX2NvZGVfMjMsDQogICAgICAgICAgIGxvY2F0aW9uID0gY2FtcHMsIA0KICAgICAgICAgICBjYW1wX3Bjb2RlID0gcF9jb2RlX2NhbXApICU+JSANCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoImNhbXAiKSkgJT4lIA0KICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgICBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogICAgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgcmVsb2NhdGUoc3RhdGVfbmFtZSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBpbmR1c3RyaWFsIHpvbmVzDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgc2VsZWN0KHN0YXRlXzI4OmluZHVzdHJpYWxfem9uZXMpICU+JSANCiAgICByZW5hbWUoc3RhdGVfbmFtZSA9IHN0YXRlXzI4LCANCiAgICAgICAgICAgYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfMjksDQogICAgICAgICAgIGxvY2F0aW9uID0gaW5kdXN0cmlhbF96b25lcykgJT4lDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIHJlZ2V4X2xlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgICAgICAgICBieSA9IGMoImxvY2F0aW9uIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgICAjIHJlcGxhY2luZyB0aGUgTkFzIHdpdGggMHMgc28gdGhlIGZpbHRlciBkb2Vzbid0IGRyb3AgdGhlbSANCiAgICByZXBsYWNlX25hKGxpc3QodG93bnNoaXBfbmFtZSA9IDAsIGFkbWluM19wY29kZSA9IDAsIGFkbWluMV9wY29kZSA9IDApKSAlPiUNCiAgICBmaWx0ZXIoYWRtaW4zX3Bjb2RlICE9ICJNTVIwMTMwNDAiKSAlPiUgIyByZW1vdmluZyBhbGwgdGhlIG1hdGNoZXMgYmV0d2VlbiBIbGFpbmd0aGFyeWEgYW5kIEhsYWluZw0KICAgIGZpbHRlcihhZG1pbjNfcGNvZGUgIT0gIk1NUjAxMTAwNiIpICU+JSAjIHJlbW92aW5nIGFsbCB0aGUgbWF0Y2hlcyBiZXR3ZWVuIFllbmFuZ3lhdW5nIGFuZCBZZQ0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJpbmR1c3RyaWFsX3pvbmUiKSkNCiAgDQopJT4lDQogIG11dGF0ZShsb2NhdGlvbl9jb2RlID0gY2FzZV93aGVuKGxvY2F0aW9uX3R5cGUgPT0gImNhbXAiIH4gY2FtcF9wY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAicGF5YW0iIH4gcGF5YW1fY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAiaW5kdXN0cmlhbF96b25lIiB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUNCiAgbXV0YXRlKGxvY2F0aW9uc19mdXp6eSA9IHN0cl9yZXBsYWNlX2FsbChsb2NhdGlvbiwgIltbOnB1bmN0Ol1dIiwgIiIpKQ0KDQojIHJlYWRpbmcgaW4gNXdzDQpmc2MgPC0gcmVhZF9leGNlbCgNCiAgIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsMTlfKGluY2x1ZGVkIEFsbCBJUCBSZXBvcnRzKV9KYW4gdG8gU2VwIDIwMjFfSU0gQ29tYmluZWRfRmluYWwueGxzeCIsDQogICAgICAgICAgICAgICAgICBzaGVldCA9ICJGU0MgNVcgQWN0aXZpdGVzIiwNCiAgICAgICAgICAgICAgICAgIHNraXAgPSA1KSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QobW9udGhfb2ZfaW1wbGVtZW50YXRpb246aHJwX3ZlcnNpb24pICU+JSANCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyX29mXyIsICIiKSkgJT4lDQogIHJlbmFtZV9hbGwofnN0cl9yZXBsYWNlX2FsbCguLCAiXm51bWJlcl8iLCAiIikpICU+JSANCiAgcmVuYW1lKGFkbWluNF9wY29kZSA9IGFkbWluM19wY29kZSwgDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjJfcGNvZGUsDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcmVhY2hlZF9iZW5lZmljaWFyaWVzLA0KICAgICAgICAgaG91c2Vob2xkcyA9IHJlYWNoZWRfaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSBiZW5lZmljaWFyaWVzX3R5cGUpICU+JSANCiAgbXV0YXRlKGluZHVzdHJpYWxfem9uZXMgPSByZXBsYWNlKGluZHVzdHJpYWxfem9uZXMsIGluZHVzdHJpYWxfem9uZXMgPT0gIk5vIiwgTkEpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVwbGFjZShmcmVxdWVuY3ksIGZyZXF1ZW5jeSA9PSAiTi9BIiwgTkEpKSAlPiUgDQogIG11dGF0ZShsb2NhdGlvbiA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiBjYW1wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gaW5kdXN0cmlhbF96b25lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiB2aWxsYWdlX3dhcmRfdG93bikpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBjYXNlX3doZW4oY2FtcCAhPSAiTkEiIH4gImNhbXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gImluZHVzdHJpYWxfem9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWxsYWdlX3dhcmRfdG93biAhPSAiTkEiIH4gInZpbGxhZ2Vfd2FyZF90b3duIikpICU+JQ0KICBtdXRhdGUobG9jYXRpb25zX2Z1enp5ID0gc3RyX3JlcGxhY2VfYWxsKGxvY2F0aW9uLCAiW1s6cHVuY3Q6XV0iLCAiICIpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF92YWx1ZV9tbWsgPSB2YWx1ZV9wZXJfaG91c2Vob2xkICogaG91c2Vob2xkcykgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG15KG1vbnRoX29mX2ltcGxlbWVudGF0aW9uKSkgJT4lIA0KICBtdXRhdGUodV9iZW4gPSBpZmVsc2UodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIsIGJlbmVmaWNpYXJpZXMsIDApKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKHN0YXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FjaGluIiA9ICJrYWNoaW4iKSkpICU+JSANCiAgbXV0YXRlKG1ta19oaGRfYmluID0gY2FzZV93aGVuKHZhbHVlX3Blcl9ob3VzZWhvbGQgPCAxMDAwMCB+ICJiZWxvd18xMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDEwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSAyMDAwMCB+ICIxMGtfMjBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDIwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA1MDAwMCB+ICIyMGtfNTBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDUwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA3MDAwMCB+ICI1MGtfNzBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDcwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDEwMDAwMCB+ICI3MGtfMTAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPj0gMTAwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDIwMDAwMCB+ICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDIwMDAwMCAmIHZhbHVlX3Blcl9ob3VzZWhvbGQgPD0gMzAwMDAwIH4gIjIwMGtfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPiAzMDAwMDAgfiAiYWJvdmVfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwNCiAgICAgICAgIG1ta19oaGRfYmluID0gZmN0X3JlbGV2ZWwobW1rX2hoZF9iaW4sIGMoImxlc3NfdGhhbl8xMGsiLCAiMTBrXzIwayIsIjIwa181MGsiLCAiNTBrXzcwayIsICI3MGtfMTAwayIsICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMGtfMzAwayIsIm1vcmVfdGhhbl8zMDBrIikpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVjb2RlKGZyZXF1ZW5jeSwgIm1vbnRobHkiID0gIk1vbnRobHkiKSkgJT4lDQogIG11dGF0ZSh1c2RfaGhkX2JpbiA9IA0KICAgICAgICAgICBjYXNlX3doZW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMCB+ICI8JDEwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDEwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAyMCB+ICI+PSQxMF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDIwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCA0MCB+ICI+PSQyMF88JDQwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDQwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCA2MCB+ICI+PSQ0MF88JDYwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDYwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMDAgfiAiPj0kNjBfPCQxMDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMTAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAyMDAgfiAiPj0kMTAwXzwkMjAwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDIwMCB+ICI+PSQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgdXNkX2hoZF9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfaGhkX2JpbiwgYygiPCQxMCIsICI+PSQxMF88JDIwIiwgIj49JDIwXzwkNDAiLCAiPj0kNDBfPCQ2MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kNjBfPCQxMDAiLCAiPj0kMTAwXzwkMjAwIiwgIj49JDIwMCIpKSkgJT4lIA0KICBtdXRhdGUoaHJwX2luZGljYXRvciA9DQogICAgICAgICAgcmVjb2RlKGhycF9pbmRpY2F0b3IsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgPSANCiAgICAgICAgICAgICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiLA0KICAgICAgICAgICJOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0LCBjb250cmlidXRpbmcgdG8gaG91c2Vob2xkIGZvb2Qgc2VjdXJpdHkiID0NCiAgICAgICAgICAgICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBzdHJfdHJpbShiZW5lZmljaWFyeV90eXBlKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgICAgIlJha2hpbmUgc3RhdGVsZXNzIiA9ICJOb24tZGlzcGxhY2VkIHN0YXRlbGVzcyBwZW9wbGUgaW4gUmFraGluZSIpKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHkgPSByZWNvZGUoYWN0aXZpdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyB0aHJvdWdoIGluLWtpbmQgYXNzaXN0YW5jZSB0byBhY3V0ZWx5IGZvb2QgaW5zZWN1cmUgcG9wdWxhdGlvbiBpbiBydXJhbCBhcmVhcyIgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIHRlY2huaWNhbCB0cmFpbmluZyAoYWdyaWN1bHR1cmUsIGxpdmVzdG9jayBicmVlZGluZywgbGl2ZWxpaG9vZCkiID0gIlByb3ZpZGUgdGVjaG5pY2FsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgc3VwcG9ydCBmb3IgSW5jb21lIEdlbmVyYXRpbmcgQWN0aXZpdGllcyIgPSAiUHJvdmlkZSBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgdG8gYWN1dGVseSBmb29kIGluc2VjdXJlIHBvcHVsYXRpb24gaW4gcnVyYWwgYXJlYXMiID0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc2ggZm9yIFdvcmsgLyBGb29kIGZvciBBc3NldHMgYWN0aXZpdGllcyIgPSAiQ2FzaCBmb3IgV29yayAvIEZvb2QgZm9yIEFzc2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGZpc2hlcnkga2l0cyAoaW4ta2luZCAvIENCVCkiID0gIlByb3ZpZGUgZmlzaGVyeSBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgY3JvcHMgJiB2ZWdldGFibGVzIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGNyb3BzICYgdmVnZXRhYmxlcyBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbGl2ZXN0b2NrIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGxpdmVzdG9jayBraXRzIikpDQoNCg0KIyBiZW4gZGF0YXNldCAtLSB0aWR5IGZvcm1hdCA1V3MgZm9yIGJlbmVmaWNpYXJpZXMgDQpiZW4gPC0gZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgIA0KICBzZWxlY3QoZGF0ZSwNCiAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVycywgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSwNCiAgICAgICAgIHN0YXRlLCB0b3duc2hpcCwgdmlsbGFnZV93YXJkX3Rvd24sIGxvY2F0aW9uLCBsb2NhdGlvbl90eXBlLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSwNCiAgICAgICAgIGFjdGl2aXR5LCBhY3Rpdml0eV9zdGF0dXMsIGhycF9pbmRpY2F0b3IsIGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgY2hpbGRfbWFsZSwgY2hpbGRfZmVtYWxlLCBhZHVsdF9tYWxlLCBhZHVsdF9mZW1hbGUsIGVsZGVybHlfbWFsZSwgZWxkZXJseV9mZW1hbGUpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjaGlsZF9tYWxlOmVsZGVybHlfZmVtYWxlLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImRpc2FnZ3JlZ2F0aW9uIiwgdmFsdWVzX3RvID0gImJlbmVmaWNpYXJpZXMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpDQogDQoNCiMgcmVhZGluZyBpbiBwaW4gYW5kIHRhcmdldHMNCnBpbiA8LSByZWFkX2V4Y2VsKCJQSU4gY2FsY3VsYXRpb24gRm9vZCBTZWN1cml0eSBDbHVzdGVyX1Rvd25zaGlwIEJyZWFrZG93bi54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiRm9vZCBTZWMgUGlOIHdpdGggSURQcyIsIA0KICAgICAgICAgICBza2lwID0gMikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KC1jKHgxNywgeDE4LCB4MTkpKSAlPiUgDQogIHNsaWNlKDE6MzQ2KSAlPiUgDQogIGZpbGwocmVnaW9uKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IHJlZ2lvbiwNCiAgICAgICAgIGlkcHMgPSBpZF9wcywgDQogICAgICAgICBwb3BfbWludXNfaWRwcyA9IHBvcHVsYXRpb25fbWludXNfaWRfcHMsIA0KICAgICAgICAgcGluXzIwMjIgPSB2dWxuZXJhYmxlX2Zvb2RfaW5zZWN1cmVfcGVvcGxlX2lkX3BzKSAlPiUgIA0KICBmaWx0ZXIodG93bnNoaXAgIT0gIlRvdGFsIikgJT4lICANCiAgbXV0YXRlX2F0KHZhcnMocG9wX21pbnVzX2lkcHM6bW9kZXJhdGVseV9zZXZlcmVseSksIH4gYXMubnVtZXJpYyguKSkgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzLCBieSA9IGMoInRvd25zaGlwIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgc2VsZWN0KC1zdGF0ZSkgJT4lICANCiAgcmVsb2NhdGUoYWRtaW4zX3Bjb2RlKSAlPiUgcmVsb2NhdGUoc3RhdGUgPSBzdGF0ZV9uYW1lKSAlPiUgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogIG11dGF0ZShwY192dWwgPSBwaW5fMjAyMiAvIHRvdGFsX3BvcCwNCiAgICAgICAgIHBpbl8yMDIyID0gcm91bmQocGluXzIwMjIsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCJGU0MgUElOIGFuZCBUYXJnZXQgX2NvbWJpbmUgSFJQIGFuZCBJRVJQIDIwMjEueGxzeCIpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlID0gdHNwX3Bjb2RlLCBwaW5fMjAyMSA9IHBpbiwgdGFyZ2V0XzIwMjEgPSB0YXJnZXQpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCJmc190YXJnZXRzXzIwMjEueGxzeCIpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KHRvd25zaGlwID0geDEsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X2lkcHNfMjAyMSA9IGludGVybmFsbHlfZGlzcGxhY2VkX3BlcnNvbnNfMTIsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxID0gaWRwX3JldHVybmVlc19yZXNldHRsZWRfbG9jYWxseV9pbnRlZ3JhdGVkXzEzLA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxID0gbm9uX2Rpc3BsYWNlZF9zdGF0ZWxlc3NfcGVvcGxlX2luX3Jha2hpbmVfMTQsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X290aGVyX3Z1bG5lcmFibGVfMjAyMSA9IG90aGVyX3Z1bG5lcmFibGVfY3Jpc2lzX2FmZmVjdGVkX3Blb3BsZV8xNSwNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfdG90YWwgPSB0b3RhbF8xNikgJT4lDQogICAgICAgICAgICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lICBzZWxlY3QodG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSBjKCJ0b3duc2hpcCIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtdG93bnNoaXApLA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAgICANCg0KDQojIHNoYXBlZmlsZXMNCnBjb2RlM19zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KICByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkNCg0KcGNvZGUxX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUpDQoNCiMgZm9yIHJlbGV2ZWxsaW5nIC0tIHRoaXMgaXMgaW4gb3JkZXIgb2YgYmVuZWZpY2lhcmllcw0Kc3Jfb3JkIDwtIGMoIllhbmdvbiIsICJSYWtoaW5lIiwgIkthY2hpbiIsICJTaGFuIChOb3J0aCkiLCAiQXlleWFyd2FkeSIgLCAiS2F5aW4iLCAiTW9uIiwgIk1hbmRhbGF5IiwNCiAgICAgICAgICAgICJLYXlhaCIsICJDaGluIiwgIlNoYW4gKFNvdXRoKSIsICJTYWdhaW5nIiwgIkJhZ28gKEVhc3QpIiwgIk1hZ3dheSIsICJTaGFuIChFYXN0KSIsICJCYWdvIChXZXN0KSIsICJUYW5pbnRoYXJ5aSIpDQoNCiMgZm9yIHByaW50aW5nIHRoZSB0YXJnZXRzIG9mIHRoZSBwaW4gDQp0YXJnZXRfYmVuXzIwMjEgPC0gcGluICU+JSAgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUsIHN0YXRlLCB0b3duc2hpcCwgdGFyZ2V0XzIwMjEpICU+JSANCiAgZmlsdGVyKHRhcmdldF8yMDIxID4gMCkgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUocGNfcmVhY2hlZCA9IGJlbmVmaWNpYXJpZXMgLyB0YXJnZXRfMjAyMSAqIDEwMCkgJT4lICANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgDQoNCmBgYA0KDQoNCiMjIDEuIEdlb2dyYXBoaWNhbCBjb3ZlcmFnZQ0KDQojIyMgMS4xIENvbXBhcmluZyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYW5kIDIwMjEgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KQSB0b3RhbCBvZiBgciBzdW0oYmVuJGJlbmVmaWNpYXJpZXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB1bmlxdWUgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gcmVhY2hlZCBhY3Jvc3MgdGhlIGNvdW50cnk7IHRoaXMgaXMgYHIgcm91bmQoc3VtKGJlbiRiZW5lZmljaWFyaWVzKSAvIHN1bShwaW4kdGFyZ2V0XzIwMjEpICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSB0YXJnZXR0ZWQgYHIgc3VtKHBpbiR0YXJnZXRfMjAyMSkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnM7IGhvd2V2ZXIsIG5vdCBhbGwgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBjb3JyZXNwb25kZWQgdG8gYXJlYXMgd2hlcmUgdGhlcmUgd2VyZSB0YXJnZXRzIC0tIHRoaXMgaXMgZXhwbG9yZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdG93bnNoaXBzLg0KDQo8YnI+DQoNCg0KYGBge3IgYmFycGxvdC1zdGF0ZS1iZW5lZmljaWFyaWVzLXBpbn0NCiMgYWRkIGEgdGhpcmQgY29sdW1uIGZvciB0YXJnZXQgZm9yIGFsbCB0aGUgYmFycGxvdHMgDQpwaW4gJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgMCwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdGFyZ2V0XzIwMjEgPSBzdW0odGFyZ2V0XzIwMjEpLCANCiAgICAgICAgICAgIHBpbl8yMDIxID0gc3VtKHBpbl8yMDIxKSkgJT4lIA0KICBmaWx0ZXIocGluXzIwMjEgPiAwIHwgYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgcGl2b3RfbG9uZ2VyKC1zdGF0ZSwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3JlbGV2ZWwoc3RhdGUsIHNyX29yZCksIHkgPSB2YWx1ZSwgZmlsbCA9IGZjdF9yZWxldmVsKHR5cGUsIGMoImJlbmVmaWNpYXJpZXMiLCAidGFyZ2V0XzIwMjEiLCAicGluXzIwMjEiKSkpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC40LCBhbmdsZSA9IDcwKSkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgYW5kIHBlb3BsZSBpbiBuZWVkICgyMDIxKSIpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkNCmBgYA0KDQo8YnI+DQoNCiMjIyAxLjIgVGFibGUgb2YgYmVuZWZpY2lhcmllcyBhbmQgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyaWVzLXBpbi1zdGF0ZX0NCiMgY2hhbmdlIGZvcm11bGFzIHRvIGxvb2sgYXQgJSBvZiB0YXJnZXQgYW5kIHNob3cgUElOLCB0YXJnZXQgYW5kIGFjaGlldmVtZW50IGluIHRoZSB0YWJsZSANCnBpbiAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAwLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0YXJnZXQgPSByb3VuZChzdW0odGFyZ2V0XzIwMjEpLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICAgICBQSU4gPSByb3VuZChzdW0ocGluXzIwMjEpLCBkaWdpdHMgPSAwKSkgJT4lDQogIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCB8IFBJTiA+IDApICU+JSANCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX3RhcmdldF9yZWFjaGVkYCA9IGlmZWxzZShpcy5pbmZpbml0ZShiZW5lZmljaWFyaWVzIC8gdGFyZ2V0ICogMTAwKSwgTkFfcmVhbF8sIGJlbmVmaWNpYXJpZXMgLyB0YXJnZXQgKiAxMDApLA0KICAgICAgICAgYCVfdGFyZ2V0X3JlYWNoZWRgID0gcm91bmQoYCVfdGFyZ2V0X3JlYWNoZWRgLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSByb3VuZCh0YXJnZXQgLyBzdW0odGFyZ2V0KSAqIDEwMCwgZGlnaXRzID0gMikpICAlPiUgDQogIHJlbG9jYXRlKGAlX29mX2JlbmAsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcmVsb2NhdGUoYCVfdGFyZ2V0X3JlYWNoZWRgLCAuYWZ0ZXIgPSB0YXJnZXQpICU+JSANCiAgcmVsb2NhdGUoYCVfb2ZfdGFyZ2V0YCwgLmFmdGVyID0gdGFyZ2V0KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhbmQgUElOIGJ5IHN0YXRlL3JlZ2lvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQpgYGANCg0KPGJyPg0KDQpZYW5nb24gYW5kIFJha2hpbmUgZm9ybSBib3RoIDgyJSBvZiB0aGUgdGFyZ2V0IGFuZCA4MiUgb2YgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gTWFuZGFsYXkgaGFzIGhhcyB0aGUgbGFyZ2VzdCBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0cyBhbmQgYmVuZWZpY2lhcmllcyByZWFjaGVkLiBUaGVyZSB3ZXJlIGZvdXIgc3RhdGVzIChBeWV5YXJ3YWR5LCBNb24sIFNhZ2FpbmcgYW5kIE1hZ3dheSkgd2hlcmUgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYnV0IHdlcmUgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIDIwMjEgdGFyZ2V0IG9yIFBJTjsgaG93ZXZlciwgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiB0aGVzZSBhcmVhcyByZXByZXNlbnQgbGVzcyB0aGFuIDUlIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIEFkZGl0aW9uYWxseSwgdGFyZ2V0cyBoYXZlIGJlZW4gZXhjZWVkZWQgaW4gNyBzdGF0ZXMsIHdpdGggS2F5aW4gaGF2aW5nIHJlYWNoZWQgNjg0JSBvZiBpdHMgdGFyZ2V0IG9mIDYsODU1IHBlcnNvbnMuIA0KDQpIb3dldmVyLCBtb3ZpbmcgZm9yd2FyZCwgdGhlIFBJTiBmb3IgMjAyMiBpcyBtdWNoIG1vcmUgZXZlbmx5IHNwcmVhZCBhY3Jvc3MgdGhlIGNvdW50cnk6IHdpdGggcmVmZXJlbmNlIHRvIHRoZSBwbG90IGJlbG93LCBZYW5nb24sIGFsb25nIHdpdGggTWFnd2F5IGFuZCBNYW5kYWxheSBoYXZlIHNvbWUgb2YgdGhlIGxvd2VzdCBwcm9wb3J0aW9ucyBvZiB2dWxuZXJhYmxlIHBlcnNvbnMgaW4gcmVsYXRpb24gdG8gdGhlIHRvdGFsIHN0YXRlIHBvcHVsYXRpb24sIG1lYW5pbmcgdGhhdCBjYXJlZnVsIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBhbmQgdGlnaHQgdnVsbmVyYWJpbGl0eSBpbiB0aGVzZSBhcmVhcyB3aWxsIG5lY2Vzc2FyeSB0byBhdm9pZCBleGNlc3NpdmUgaW5jbHVzaW9uIGVycm9ycy4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1waW4tdnVsLXN0YXRlfQ0KcGluICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgZmlsdGVyKHN0YXRlICE9ICJOYXkgUHlpIFRhdyIpICU+JSANCiAgc3VtbWFyaXNlKHBpbl8yMDIyID0gcm91bmQoc3VtKHBpbl8yMDIyKSksDQogICAgICAgICAgICB0b3RhbF9wb3AgPSBzdW0odG90YWxfcG9wKSkgJT4lIA0KICBtdXRhdGUoYHZ1bG5lcmFibGUlYCA9IHJvdW5kKHBpbl8yMDIyIC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIHN0YXRlID0gcmVvcmRlcihzdGF0ZSwgLWB2dWxuZXJhYmxlJWApKSAgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IHBpbl8yMDIyLCBmaWxsID0gYHZ1bG5lcmFibGUlYCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBgdnVsbmVyYWJsZSVgKSwgc2l6ZSA9IDIuNSwgdmp1c3QgPSAtMC41KSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDAuNikpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgcGVvcGxlIGluIG5lZWQiLCANCiAgICAgICB0aXRsZSA9ICIyMDIyIFBJTiBhbmQgaW5jaWRlbmNlIG9mIHZ1bG5lcmFiaWx0eSBieSBzdGF0ZSBhbmQgcmVnaW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJWdWxuZXJhYmlsaXR5IGlzIGRlZmluZWQgaGVyZSBhcyB0aGUgcHJvcG9ydGlvbiBvZiBhIHBvcHVsYXRpb24gd2hvIGFyZSBmb29kIGluc2VjdXJlIG9yIGFyZSBJRFBzIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwMDAwMDAsIGJ5ID0gMjAwMDAwKSwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHRyYW5zID0gInJldmVyc2UiKQ0KYGBgDQoNCjxicj4NCg0KDQojIyMgMS4zIFRvd25zaGlwLWxldmVsIGRpc3RyaWJ1dGlvbiBvZiBiZW5lZmljaWFyaWVzDQoNCkp1c3QgYXMgdGhlIHJlc3BvbnNlIGlzIGhlYXZpbHkgd2VpZ2h0ZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUgYXQgdGhlIHN0YXRlIGFuZCByZWdpb24gbGV2ZWwsIHRoZSBzYW1lIGlzIHRydWUgYXQgdGhlIHRvd25zaGlwIGxldmVsIGFzIHdlbGwuIFRoZXNlIDEwIHRvd25zaGlwcyBiZWxvdyBhcmUgd2hlcmUgODAlIG9mIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIHJlYWNoZWQgY29sbGVjdGl2ZWx5LCB0aGV5IHJlcHJlc2VudCA1MyUgb2YgdGhlIDIwMjEgdGFyZ2V0LiBJbiBwYXJ0aWN1bGFyLCBIbGFpbmd0aGFyeWEgaGFzIGJlbmVmaWNpYXJ5IGZpZ3VyZXMgdGhhdCBhcmUgMzc4JSBvZiBpdHMgdGFyZ2V0LiBBZGRpdGlvbmFsbHksIG5laXRoZXIgS2F3YXJlaWsgaW4gS2F5aW4gb3IgS3lhaWttYXJhdyBpbiBNb24gd2VyZSB0YXJnZXR0ZWQgYXMgcGFydCBvZiB0aGUgMjAyMSBQSU4gZGVzcGl0ZSBiZWluZyBpbiB0aGUgdG9wIDEwIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgLS0gb25seSA4OC41JSBvZiBiZW5lZmljaWFyaWVzIGNvcnJlc3BvbmRlZCB0byB0b3duc2hpcHMgd2l0aCB0YXJnZXRzLiAgDQoNCmBgYHtyIHRhYmxlLXRvcC10b3duc2hpcHMtYmVuZWZpY2lhcmllc30NCiMgY2hlY2sgdGhlIHBhcmFncmFwaCB0ZXh0IGFib3ZlIGlmIHlvdSByZXJ1biB0aGUgcmVwb3J0IG9uIG5ldyBkYXRhIA0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCB0b3duc2hpcCwgc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUgc2VsZWN0KGFkbWluM19wY29kZSwgdGFyZ2V0ID0gdGFyZ2V0XzIwMjEpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSBpZmVsc2UoaXMuaW5maW5pdGUodGFyZ2V0IC8gc3VtKHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMCksIE5BX3JlYWxfLCB0YXJnZXQgLyBzdW0odGFyZ2V0LCBuYS5ybSA9IFRSVUUpICogMTAwKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSByb3VuZChgJV9vZl90YXJnZXRgLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlcmVhY2hlZGAgPSBpZmVsc2UoaXMuaW5maW5pdGUoYmVuZWZpY2lhcmllcyAvIHRhcmdldCAqIDEwMCksIE5BX3JlYWxfLCBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0ICogMTAwKSwNCiAgICAgICAgIGAlcmVhY2hlZGAgPSByb3VuZChgJXJlYWNoZWRgLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoLWFkbWluM19wY29kZSkgJT4lIA0KICByZWxvY2F0ZShgJV9vZl9iZW5gLCAuYWZ0ZXIgPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIHJlbG9jYXRlKHN0YXRlLCAuYWZ0ZXIgPSB0b3duc2hpcCkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgaGVhZCgxMCkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJUb3AgMTAgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIxIikNCmBgYA0KDQo8YnI+DQoNCmByIGJlbiAlPiUgc2VsZWN0KHRvd25zaGlwKSAlPiUgZGlzdGluY3QoKSAlPiUgbnJvdygpYCB0b3duc2hpcHMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgZm9vZCBzZWN1cml0eSBhY3Rpdml0aWVzIGluIHRoZSBmaXJzdCB0aHJlZS1xdWFydGVycyBvZiAyMDIxLiBUaGlzIGlzIGxlc3MgdGhhbiBhIHRoaXJkIG9mIHRoZSAzMzAgdG93bnNoaXBzIGluIHRoZSBjb3VudHJ5LiBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhyZWUgdG93bnNoaXBzIC0tIEhwYXB1biBpbiBLYXlpbiwgTXVzZSBpbiBTaGFuIChOb3J0aCkgYW5kIEt5ZXRoaSBpbiBTaGFuIChTb3V0aCkgaGF2ZSBiZWVuIHRhcmdldHRlZCBzaW5jZSB0aGUgaW5pdGlhbCAyMDIxIEhSUCwgeWV0IGhhdmUgbm90IGJlZW4gcmVhY2hlZCBieSBhbnkgRlNDIGFjdGl2aXRpZXM7IDEwIHRvd25zaGlwcywgb3ZlcmFsbCwgaW4gZWl0aGVyIHRoZSBIUlAgb3IgSUVSUCwgaGF2ZSBub3QgYmVuZWZpdHRlZCBmcm9tIGFueSBGU0MgYWN0aXZpdGllcy4gDQoNCk92ZXJhbGwsIGByIHJvdW5kKHN1bSh0YXJnZXRfYmVuXzIwMjEkYmVuZWZpY2lhcmllcykgLyBzdW0odGFyZ2V0X2Jlbl8yMDIxJHRhcmdldF8yMDIxKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiB0aGUgdGFyZ2V0dGVkIHBvcHVsYXRpb24gd2FzIHJlYWNoZWQuIEZyb20gdGhlIGhpc3RvZ3JhbSBiZWxvdywgd2UgY2FuIHNlZSB0aGF0IG92ZXJyZWFjaCBhbmQgdW5kZXItcmVhY2hpbmcgYXJlIHZlcnkgY29tbW9uIGF0IHRoZSB0b3duc2hpcCBsZXZlbCAtLSB0b3duc2hpcHMgYXJlIGNvbW1vbmx5IGNsdXN0ZXJlZCBhdCBhcm91bmQgMCUgcmVhY2hlZCBhbmQgYWxzbyBhdCAyMDAlIHJlYWNoZWQgb3IgbW9yZS4gT2YgdGhlIDUxIHRvd25zaGlwcyB0YXJnZXR0ZWQgaW4gMjAyMTsgMjEgdG93bnNoaXBzIHJlYWNoZWQgbW9yZSB0aGFuIDEyMCUgb2YgdGhlaXIgdGFyZ2V0LCA0IHJlYWNoZWQgYmV0d2VlbiAxMDAlIGFuZCAxMTklIG9mIHRoZWlyIHRhcmdldDsgNyB0b3duc2hpcHMgcmVhY2hlZCBiZXR3ZWVuIDgwJSBhbmQgMTAwJSBvZiB0aGVpciB0YXJnZXQ7IGFuZCAyIHRvd25zaGlwcyByZWFjaGVkIGxlc3MgdGhhbiA4MCUgb2YgdGhlaXIgdGFyZ2V0LiAgDQoNCjxicj4NCg0KYGBge3IgaGlzdG9ncmFtLWJlbmVmaWNpYXJpZXMtaHJwLXRhcmdldC1yZWFjaGVkfQ0KDQpwaW4gJT4lICANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgc3RhdGUsIHRvd25zaGlwLCB0YXJnZXRfMjAyMSkgJT4lIA0KICBmaWx0ZXIodGFyZ2V0XzIwMjEgPiAwKSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gYmVuZWZpY2lhcmllcyAvIHRhcmdldF8yMDIxICogMTAwKSAlPiUgIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gaWZlbHNlKHBjX3JlYWNoZWQgPiAyMDAsIDIwMCwgcGNfcmVhY2hlZCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCkpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyMCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAsIGJ5ID0gMjApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgDQogIGxhYnMoeCA9ICIlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIiwNCiAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdG93bnNoaXBzIGJ5IHBlcmNlbnRhZ2Ugb2YgMjAyMSBIUlAgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJWYWx1ZXMgYWJvdmUgMjAwJSBoYXZlIGJlZW4gbHVtcGVkIHRvZ2V0aGVyIGF0IDIwMCUiKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDEuNCBMb2NhdGlvbnMNCg0KUGFydG5lcnMgaGF2ZSByZXNwb25kZWQgaW4gYSB0b3RhbCBvZiBgciBiZW4gJT4lIHNlbGVjdChsb2NhdGlvbikgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgbG9jYXRpb25zIGFjcm9zcyB0aGUgY291bnRyeSwgd2l0aCB0aGUgdmFzdCBtYWpvcml0eSBvZiBsb2NhdGlvbnMgb25seSBoYXZpbmcgb25seSBvbmUgcGFydG5lciBvcGVyYXRpbmcgaW4gdGhlbTsgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRuZXJzIGluIGFueSBsb2NhdGlvbiBpcyAzLiBPZiB0aGUgYHIgZnNjICU+JSBucm93KClgIHJvd3MgcmVwb3J0ZWQgaW4gdGhlIDVXcywgb25seSBgciBzdW0oaXMubmEoZnNjJGxvY2F0aW9uKSlgIGRpZCBub3QgcmVwb3J0IGEgc3BlY2lmaWMgbG9jYXRpb24uDQoNCkxvY2F0aW9ucyBhcmUgY2xhc3NpZmllZCBpbnRvIHRocmVlIGdyb3VwcyAtLSBjYW1wcywgaW5kdXN0cmlhbCB6b25lcyBhbmQgdmlsbGFnZXMvdG93bnMvd2FyZHM6DQoNCmBgYHtyIHRhYmxlLWxvY2F0aW9uc30NCg0KYmVuICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UobG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbiksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KHRvd25zaGlwKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHBjX29mX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGF2Z19iZW5fcGVyX2xvYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBsb2NhdGlvbnMsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGxvY2F0aW9uIHR5cGVzIikNCmBgYA0KDQo8YnI+DQoNClRoZSB2YXN0IG1ham9yaXR5IG9mIGxvY2F0aW9ucyBhcmUgc2VydmVkIGJ5IG9ubHkgb25lIHBhcnRuZXIuIEJlbG93IGFyZSBhIHNlcmllcyBvZiBoaXN0b2dyYW1zIHNob3dpbmcgdGhlIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb24sIHNwbGl0IGJ5IG51bWJlciBvZiBwYXJ0bmVycyBpbiBlYWNoIGxvY2F0aW9uOg0KDQpgYGB7ciBoaXN0b2dyYW0tbG9jYXRpb25zLWJ5LXBhcnRuZXJ9DQoNCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCkgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgYXJyYW5nZShkZXNjKHBhcnRuZXJzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSkgKw0KICBzY2FsZV94X2xvZzEwKCkgKw0KICBmYWNldF93cmFwKH4gcGFydG5lcnMpICsNCiAgbGFicyh5ID0gIm51bWJlciBvZiBsb2NhdGlvbnMiLA0KICAgICAgIHggPSAiYmVuZWZpY2lhcmllcyBwZXIgbG9jYXRpb24iLCANCiAgICAgICB0aXRsZSA9ICJIaXN0b2dyYW1zIG9mIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgbnVtYmVyIG9mIHBhcnRuZXJzIHBlciBsb2NhdGlvbiIpDQoNCmBgYA0KDQo8YnI+DQoNClRoZSBtb3JlIHBhcnRuZXJzIG9wZXJhdGluZyBpbiBhIGdpdmVuIGxvY2F0aW9uLCB0aGUgaGlnaGVyIHRoZSBhdmVyYWdlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzOyBob3dldmVyLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGVzZSBtdWx0aS1wYXJ0bmVyIGxvY2F0aW9ucyBhcmUgY29tcGFyYXRpdmVseSByYXJlOg0KDQpgYGB7ciB0YWJsZS1sb2NhdGlvbnMtcGFydG5lcnN9DQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBzdW0obl9kaXN0aW5jdChsb2NhdGlvbikpLA0KICAgICAgICAgICAgYXZnX2JlbmVmaWNpYXJpZXMgPSBtZWRpYW4oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIGAxYCA9ICJvbmVfcGFydG5lciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAidHdvX3BhcnRuZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJ0aHJlZV9wYXJ0bmVycyIpKSAlPiUgDQogcGFuZGVyKCkNCg0KYGBgDQoNCjxicj48YnI+DQoNCg0KDQojIyAyLiBBY3Rpdml0aWVzIGFuZCBtb2RhbGl0aWVzDQoNCiMjIyAyLjEgUHJvZ3Jlc3MgYnkgYWN0aXZpdHkNCg0KYGBge3IgbGluZS1wbG90LWZhY2V0LWFjdGl2aXR5fQ0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiY3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgMjAyMSBRMS1RMyIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkNCg0KYGBgDQoNClBhcnRuZXJzIHJlcG9ydGVkIHRoZWlyIGFjaGlldmVtZW50cyBhY3Jvc3MgdGhlIGVpZ2h0IDVXIGFjdGl2aXRpZXMuIEFzIG5vdGUsIHdlIHNlZSB0aGF0IHRoZSBtYWpvcml0eSBvZiB0aGUgY2FzZWxvYWQgZm9yIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgd2FzIGVzdGFibGlzaGVkIHByaW9yIHRvIDIwMjEgKHdpdGggdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIG9ubHkgaW5jcmVhc2luZyB2ZXJ5IGluY3JlbWVudGFsbHkgYWNyb3NzIHRoZSBjb3Vlc2Ugb2YgdGhlIHllYXIpIC0tIHRoaXMgYWxpZ25zIHdpdGggb3VyIHVuZGVyc3RhbmRpbmcgdGhhdCBtYW55IG9mIHRoZSBwcm9qZWN0cyBjb250cmlidXRpbmcgdG8gdGhpcyBhY3Rpdml0eSB3ZXJlIG11bHRpLXllYXIgaW4gbmF0dXJlIGFuZCBoYWQgYmVlbiBvbmdvaW5nIHByaW9yIHRvIHRoZSBIUlAuIA0KDQpPbmUgb2YgdGhlIGRpZmZpY3VsdGllcyBvZiBpbnRlcnByZXRpbmcgdGhlc2UgZGF0YSBpcyB0aGF0IGl0IGlzIG5vdCBhbHdheXMgYXBwYXJlbnQgd2hlcmUgdGhlIHBhdHRlcm5zIG9ic2VydmVkIGFyZSByZWZsZWN0aXZlIG9yIGNoYW5nZXMgaW4gdGhlIGZpZWxkIChzdWNoIGFzIGNoYW5nZXMgaW4gYWNjZXNzLCBmdW5kaW5nIG9yIHN0YWZmaW5nKSBvciBpZiB0aGV5IGFyZSBpbnN0ZWFkIGR1ZSB0byBwYXJ0bmVycycgcmVwb3J0aW5nIGJlaGF2aW91cnMuIFdlIG5vdGUsIGZvciBpbnN0YW5jZSwgYSBsYXJnZSBqdW1wIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBmb3IgZmlzaGVyeSBpdHMgYW5kIGZvb2QgYmFza2V0cyBhcm91bmQgSnVseSAyMDIxIC0tIHRoaXMgd2FzIGR1ZSB0byB0aGUgbmV3bHktYXBwcm92ZWQgYWRkZW5kdW0gdG8gdGhlIEhSUC4gSG93ZXZlciwgc29tZSBvZiB0aGUgb3RoZXIgY2hhbmdlcyBhcmUgbGVzcyBjbGVhciBhbmQgd2lsbCByZXF1aXJlIGNhcmVmdWwgZXhwbG9yYXRpb24gd2l0aCBwYXJ0bmVycy4gDQoNCjxicj4NCg0KIyMjIDIuMiBEZWxpdmVyeSBtb2RhbGlsdGllcw0KDQpDYXNoIHdhcyB0aGUgbWFpbiBkZWxpdmVyeSBtb2RhbGl0eSBpbiBmb3VyIG91dCBvZiB0aGUgZWlnaHQgYWN0aXZpdGllcyB1bmRlciB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBmb2xsb3dlZCBieSAiaW4ta2luZCIsIHdoaWNoIHdhcyBwcmVkb21pbmFudGx5IGVtcGxveWVkIGluIHRocmVlLiBIb3dldmVyLCB0aGUgaW4ta2luZCBtb2RhbGl0eSBoYXMgdGhlIGhpZ2hlc3QgcmVhY2gsIGdpdmVuIHRoZSBlc3BlY2lhbGx5IGxhcmdlIGJlbmVmaWNpYXJ5IG51bWJlcnMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgZm9vZCBiYXNrZXRzLiBXZSBhbHNvIG5vdGUgc2V2ZXJhbCBtaXNjbGFzc2lmaWNhdGlvbnMgLS0gc21hbGwgcG9ydGlvbnMgb2YgbW9udGhseSBjYXNoIHRyYW5zZmVycyBoYXZlIGJlZW4gY29kZWQgYXMgaW4ta2luZCBhbmQgdGhlcmUgYXJlIGluLWtpbmQgZm9vZCBiYXNrZXRzIGNvZGVkIGFzIGh5YnJpZC4gSXQgbWlnaHQgYWxzbyBiZSB3b3J0aCBtb3JlIGNsZWFybHkgZGVsaW5lYXRpbmcgYmV0d2VlbiAic3VwcG9ydCBmb3IgaW5jb21lLWdlbmVyYXRpbmcgYWN0aXZpdGllcyIgYW5kIHRoZSAicHJvdmlzaW9uIG9mIHRlY2huaWNhbCB0cmFpbmluZyIgYXMgc2VydmljZSBkZWxpdmVyeSBhbmQgc3VwcG9ydCBhcmUgaGVhdmlseSBwcmVzZW50IGluIGJvdGguDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mYWNldC1hY3Rpdml0eS1tb2RhbGl0eX0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBhY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShkZWxpdmVyeV9tb2RhbGl0eSA9IHJlY29kZShkZWxpdmVyeV9tb2RhbGl0eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSHlicmlkIChJbi1raW5kICYgQ2FzaCkiID0gIkh5YnJpZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBkZWxpdmVyeS9zdXBwb3J0IiA9ICJTZXJ2aWNlcy9zdXBwb3J0IikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGVsaXZlcnlfbW9kYWxpdHksIHkgPSBiZW5lZmljaWFyaWVzLCBmaWxsID0gYWN0aXZpdHkpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgdGl0bGUgPSAiRGVsaXZlcnkgbW9kYWxpdHkgYnkgYWN0aXZpdHksIDIwMjEgUTEtUTMiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikNCg0KYGBgDQoNCjxicj4NCg0KYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAvIHN1bShmc2MkYmVuZWZpY2lhcmllcykgKiAxMDApYCUgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVjZWl2ZWQgc3VwcG9ydCB0aHJvdWdoIHRoZSBpbi1raW5kIGRlbGl2ZXJ5IG1vZGFsaXR5OyB3ZSB1c2UgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaGVyZSBhcyB0aGVyZSB3ZXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mIG1vZGFsaXRpZXMgY2hhbmdpbmcgcGFydHdheSB0aHJvdWdoIGFuIGludGVydmVudGlvbjogZm9yIHJlZmVyZW5jZSwgYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJHVfYmVuKX0gLyBzdW0oZnNjJHVfYmVuKSAqIDEwMClgJSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbml0aWFsbHkgd2l0aCBpbi1raW5kIGludGVydmVudGlvbnMsIG1lYW5pbmcgdGhhdCB0aGVyZSB3YXMgYSB0ZW5kZW5jeSB0byBkaXZlcnNpZnkgYXdheSBmcm9tIGluLWtpbmQgc3VwcG9ydCBvdmVyIDIwMjEuIGByIHJvdW5kKGZpbHRlcihmc2MsIGRlbGl2ZXJ5X21vZGFsaXR5ID09ICJDYXNoIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJGJlbmVmaWNpYXJpZXMpICogMTAwKWAlIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHdlcmUgcmVhY2hlZCBieSBjYXNoIHRyYW5zZmVycy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1tb2RhbGl0eS1mcmVxdWVuY3l9DQojIGNoYW5nZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaW5zdGVhZCBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyANCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBmcmVxdWVuY3kpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmcmVxdWVuY3ksIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMoImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfVG90YWwgPSByb3VuZChUb3RhbCAvIHN1bShUb3RhbCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgYnkgZGVsaXZlcnkgbW9kYWxpdGllcyBhbmQgZnJlcXVlbmN5IG9mIGRpc3RyaWJ1dGlvbiIpDQoNCmBgYA0KDQo8YnI+DQoNClJlZ2FyZGluZyB0aGUgdGFibGUgYWJvdmUsIHRoZXJlIGlzIGEgc3Ryb25nIGFyZ3VtZW50IHRvIHJlbW92ZSB0aGUgb3B0aW9uICJvdGhlciIgZnJvbSB0aGUgNVcgY29sdW1uIGBmcmVxdWVuY3lgIChyZWZlcnJpbmcgdG8gZnJlcXVlbmN5IG9mIHRyYW5zZmVyL2RlbGl2ZXJ5KSAtLSB3aGF0IGV4YWN0bHkgaXQgY29ubm90ZXMgaXMgdW5jbGVhciwgYXMgcGFydG5lcnMgbWlnaHQgZWxlY3QgdGhpcyBvcHRpb24gZm9yIGFjdGl2aXRpZXMgdGhhdCBvY2N1ciBib3RoIG1vcmUgYW5kIGxlc3MgZnJlcXVlbnRseSB0aGFuIGV2ZXJ5IG1vbnRoOyB0aGVyZSBpcyBhbHNvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHBhcnRuZXJzIGFyZSBqdXN0IGVsZWN0aW5nICJvdGhlciIgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBjb2x1bW4gYmxhbmsuIEl0IGlzIHBvc3NpYmxlIHRvIGJhY2tmaWxsIHNvbWUgb2YgdGhlICJvdGhlciIgdmFsdWVzIGZyb20gdGhlIGBiZW5lZmljaWFyeV9yZWN1cnJlbmN5YCBjb2x1bW4uIFRoaXMgd2lsbCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoZSBjaGFwdGVyIG9uIGJlbmVmaWNpYXJpZXMuICANCg0KQSBrZXkgcGllY2Ugb2YgbWlzc2luZyBpbmZvcm1hdGlvbiBub3QgY3VycmVudGx5IGNhcHR1cmVkIGJ5IHRoZSA1VyB0ZW1wbGF0ZSBpcyB0aGUgZHVyYXRpb24gb2YgdGhlc2UgYWN0aXZpdGllcyAtLSB0aGUgbnVtYmVyIG9mIG1vbnRocyBhIG1vbnRobHkgZm9vZCBiYXNrZXQgaXMgcHJvdmlkZWQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBzb21ld2hhdCByZWxpYWJseSB3aXRoIGNvbnNpZGVyYWJsZSBlZmZvcnQuIFRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgYXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiB0aGUgdmFyaW91cyBhY3Rpdml0aWVzIGluIHRoZSBgZnJlcXVlbmN5YCBjYXRlZ29yeSAiTW9udGhseSI6DQoNCmBgYHtyIHRhYmxlLWF2Zy1kdXJhdGlvbi1hY3Rpdml0aWVzfQ0KZnNjICU+JSAgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIk1vbnRobHkiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB0b3duc2hpcCwgbG9jYXRpb24pICU+JQ0KICBzdW1tYXJpc2UocmVjdXJyZW5jZXMgPSBuX2Rpc3RpbmN0KGRhdGUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19kdXJhdGlvbl9tb250aHMgPSBtZWFuKHJlY3VycmVuY2VzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYXZnX2R1cmF0aW9uX21vbnRocykpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiBtb250aGx5IGFjdGl2aXRpZXMiKQ0KICANCmBgYA0KDQo8YnI+DQoNCiMjIyAyLjMgTW9uZXRhcnkgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBwZXIgaG91c2Vob2xkDQoNCjxicj4NCg0KYGBge3IgcGxvdC11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBncm91cF9ieSh1c2RfaGhkX2JpbikgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoYCVfb2ZfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHVzZF9oaGRfYmluLCB5ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBgJV9vZl9iZW5lZmljaWFyaWVzYCksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgMTYwMDAwLCBieSA9IDIwMDAwKSkgKw0KICBsYWJzKHggPSAiVVNEIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIsDQogICAgICAgeSA9ICIlIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIGJ5IHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIpDQpgYGANCg0KPGJyPg0KDQpUaGUgbW9zdCBjb21tb24gdHJhbnNmZXIgdmFsdWVzIC0tIGluIHRlcm1zIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCAtLSBhcmUgYmV0d2VlbiBVU0QgMTAgYW5kIFVTRCAyMCwgdGhvdWdoIGl0IHNob3VsZCBiZSBub3RlZCAtLSBhbmQgY2FuIGJlIG1vcmUgY2xlYXJseSBzZWVuIGZyb20gdGhlIHRhYmxlIGJlbG93LCBhIG5vdCBpbnNpZ25pZmljYW50IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIChhYm91dCA4JSkgd2VyZSByZWFjaGVkIGJ5IGNhc2ggdHJhbnNmZXIgaW50ZXJ2ZW50aW9ucyB2YWx1ZWQgYXQgbW9yZSB0aGFuIFVTRCAxMDAgcGVyIGhvdXNlaG9sZC4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBtb25ldGFyeSB2YWx1ZXMgd2VyZSBjYWxjdWxhdGVkIG9ubHkgZnJvbSByb3dzIHdpdGggdW5pcXVlIGJlbmVmaWNpYXJpZXMgc28gdGhhdCB3ZSBhcmUgbm90IHVzaW5nIHRoZSBjdW11bGF0aXZlIHN1bXMgcGVyIGhvdXNlaG9sZC4gDQoNCmBgYHtyIHRhYmxlLXVzZC1oaGQtYmluLWZyZXF1ZW5jeX0NCiMgcmVtaW5kZXIgdG8gcmVkbyB0aGUgdmFsdWVzIGluIHRoZSBwYXJhZ2FwaCBhYm92ZSBpZiB5b3UgcmVydW4gdGhpcyBvbiBuZXcgZGF0YSANCg0KZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEodXNkX2hoZF9iaW4pICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ2FzaCIsICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIsICJWb3VjaGVyIikpICU+JSANCiAgY291bnQodXNkX2hoZF9iaW4sZnJlcXVlbmN5LCB3dCA9IGJlbmVmaWNpYXJpZXMpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZnJlcXVlbmN5LCB2YWx1ZXNfZnJvbSA9IG4pICU+JSANCiAgcmVuYW1lKHRyYW5zZmVyX3ZhbHVlID0gdXNkX2hoZF9iaW4pICU+JQ0KICByZWxvY2F0ZShGaXJzdCwgLmFmdGVyID0gdHJhbnNmZXJfdmFsdWUpICU+JSANCiAgc2VsZWN0KC1gTkFgKSAlPiUgDQogIGFkb3JuX3RvdGFscygiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShwY19vZl9Ub3RhbCA9IHJvdW5kKFRvdGFsIC8gc3VtKFRvdGFsKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQ2FzaCB0cmFuc2ZlciwgaHlicmlkIGFuZCB2b3VjaGVyIHZhbHVlcyBwZXIgaG91c2Vob2xkIGJ5IGZyZXF1ZW5jeSBvZiB0cmFuc2ZlciAoVVNEKSIpICAgDQpgYGANCg0KPGJyPg0KDQpOZXh0LCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIGJ5IGFjdGl2aXR5IHR5cGU6DQoNCmBgYHtyIGJhcnBsb3QtZmFjZXQtdXNkLWhoZC1iaW4tYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVzZF9oaGRfYmluKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB1c2RfaGhkX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICBsYWJzKHRpdGxlID0gIlZhcmlhdGlvbiBpbiB0aGUgIHBlciBob3VzZWhvbGQgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBpbiBVU0QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHksIHNjYWxlcyA9ICJmcmVlX3kiKQ0KDQpgYGANCg0KDQpPdmVyYWxsLCB0aGUgaGlnaGVzdCBhdmVyYWdlIGNhc2ggdHJhbnNmZXJzIHdlcmUgZnJvbSBhY3Rpdml0aWVzIHByb3ZpZGluZyBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiBhbmQgdGhlIGxvd2VzdCBhdmVyYWdlcyBjb21pbmcgZnJvbSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIChhZnRlciBkaXNjb3VudGluZyBmb29kIGJhc2tldHMsIHdoZXJlIGxlc3MgdGhhbiAxJSBvZiBhY3Rpdml0aWVzIHJlcG9ydGVkIHRoZSBwYWNrYWdlIHZhbHVlKS4gDQoNCkl0IHdvdWxkIGJlIGZydWl0ZnVsIHRvIGV4cGxvcmUgdGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIGluIG1vcmUgZGV0YWlsIC0tIHRoaXMgYWN0aXZpdHkgaGFzIGEgdmVyeSBjbGVhciBwZWFrIGF0IGA+PSQxMF88JDIwYC4gQSBjbG9zZXIgbG9vayByZXZlYWxzIHRoYXQgdGhpcyBpcyBhbG1vc3QgZW50aXJlbHkgZHVlIHRvIHRoZSBgciBmc2MgJT4lIGZpbHRlcih2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA9PSAxMC41ICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBiZW5lZmljaWFyaWVzIHdobyByZWNlaXZlZCBtb250aGx5IHRyYW5zZmVycyBvZiBVU0QgMTAuNTAvbW9udGggKG9yIE1NSyAxNSwwMDApIHBlciBob3VzZWhvbGQuIEl0IGlzIHVuY2xlYXIgd2hldGhlciB0aGlzIGlzIGEgZGF0YSBlbnRyeSBlcnJvciAtLSBidXQgd2hhdCB3ZSBkbyBrbm93IGlzIHRoYXQgdGhlIGhvdXNlaG9sZHMgdGhhdCByZWNlaXZlZCB0aGlzIHR5cGUgb2YgdHJhbnNmZXIgd2VyZSBub3QgYWJub3JtYWxseSBzbWFsbDsgaXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCBiZSBwb3NzaWJsZSB0aGF0IHRoaXMgYWN0aXZpdHkgaGFkIGJlZW4gY29uY2VpdmVkIGFzIG9uZSBzaW5ndWxhciB0cmFuc2ZlciB0aGF0IGhhZCBiZWVuIHNwbGl0IGFjcm9zcyBzZXZlcmFsIG1vbnRocy4gDQoNClRoaXMgc2hvdWxkIGJlIGZvbGxvd2VkIHVwIHdpdGggdGhlIDcgcGFydG5lcnMgd2hvIHByb3ZpZGVkIHRoaXMgdHJhbnNmZXIgdmFsdWUgdG8gYmVuZWZpY2lhcnkgaG91c2Vob2xkczsgdGhleSBhcmU6IFNhdmUgdGhlIENoaWxkcmVuLCBXRlAsIE15YW5tYXIgSGVhcnQgT3JnYW5pc2F0aW9uLCBQZW9wbGUgZm9yIFBlb3BsZSwgUGxhbiBJbnRlcm5hdGlvbmFsLCBXb3JsZCBWaXNpb24gTXlhbm1hciBhbmQgS2FydW5hIE1pc3Npb24gU29jaWFsIFNvbGlkYXJpdHkuIA0KDQpJZiBjb3JyZWN0LCB0aGlzIGFtb3VudCBmYWxscyBmYXIgYmVsb3cgdGhlIG1pbmltdW0gZXhwZW5kaXR1cmUgYmFza2V0IGZvciBmb29kIGlkZW50aWZpZWQgYnkgdGhlIENhc2ggV29ya2luZyBHcm91cCwgd2hpY2ggZXN0YWJsaXNoZWQgYSBmbG9vciBvZiBNTUsgMTkwLDU1NSBwZXIgaG91c2Vob2xkIHBlciBtb250aC4gQmVsb3cgaXMgYSB0YWJsZSB3aGljaCBzdW1tYXJpc2VzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBtaW5pbXVtIGV4cGVuZGl0dXJlIGJhc2tldCBpcyBjb3ZlcmVkIGJ5IHRoZSBkaWZmZXJlbnQgYmlucyB3ZSBoYXZlIGVzdGFibGlzaGVkIGZvciB0aGUgY2FzaC10cmFuc2ZlciB2YWx1ZXM6DQoNCmBgYHtyIHRhYmxlLW1lYi11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmIGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiKSAlPiUgDQogIGZpbHRlcighaXMubmEodmFsdWVfcGVyX2hvdXNlaG9sZCkpICU+JSANCiAgbXV0YXRlKHBjX21lYiA9IHZhbHVlX3Blcl9ob3VzZWhvbGQgLyAxOTA1NTUpICU+JSANCiAgZ3JvdXBfYnkodXNkX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGF2Z19wY19vZl9tZWIgPSByb3VuZChtZWFuKHBjX21lYikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYXZnX3VzZF9tb250aCA9IHJvdW5kKG1lYW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiTW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVyIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIikNCg0KIyByZW1pbmRlciB0byByZWRvIHZhbHVlcyB3aGVuIHlvdSByZXJ1biB0aGlzIHdpdGggbmV3IGRhdGEgDQogIA0KYGBgDQoNCkFyb3VuZCA5JSBvZiBiZW5lZmljaWFyaWVzIG9mIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgaGF2ZSByZWNlaXZlZCBtb3JlIHRoYW4gNTAlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2QuIE5vdGFibHksIDE1JSBvZiBiZW5lZmljaWFyaWVzIGhhdmUgcmVjZWl2ZWQgbGVzcyB0aGFuIFVTRCAxMCBwZXIgaG91c2Vob2xkIHBlciBtb250aC4gVGhpcyB1bmRlcnNjb3JlcyB0aGUgaW1wb3J0YW5jZSBvZiBzdGFuZGFyZGlzYXRpb246IGJlbmVmaWNpYXJpZXMgaGF2ZSBhbHJlYWR5IHJlY2VpdmVkIHZlcnkgZGlmZmVyZW50IHBhY2thZ2UgYW1vdW50cyBhbmQgdGhlcmUgaXMgYSBwcmVzc2luZyBuZWVkIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gb24gd2hldGhlciBjYXNoIHRyYW5zZmVycyAoYW5kIGZvb2QgYmFza2V0cykgaGF2ZSBiZWVuIGRlc2lnbmVkIHRvIGJlIGZ1bGwgcmF0aW9ucyBvciBhcmUgaW5zdGVhZCBpbnRlbmRlZCB0byBiZSBzdXBwbGVtZW50YXJ5IGFjdGl2aXRpZXMuIFRoaXMgaXMga2V5IGZyb20gYSBjb29yZGluYXRpb24gc3RhbmRwb2ludCBhcyB3ZSBjYW5ub3QgY29uc2lkZXIgdGhlIGZvb2Qgc2VjdXJpdHkgbmVlZHMgb2YgdGhvc2Ugd2hvIGhhdmUgb25seSByZWNlaXZlZCBzdXBwbGVtZW50YXJ5IHRyYW5zZmVycyB0byBoYXZlIGJlZW4gY292ZXJlZC4NCg0KDQo8YnI+PGJyPg0KDQojIyAzLiBQYXJ0bmVycw0KDQpPZiB0aGUgNTEgcGFydG5lcnMgb2YgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgYSB0b3RhbCBvZiBgciBmc2MgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIG9mIHRoZW0gY2xhc3NpZmllZCB0aGVtc2VsdmVzIGFzIGltcGxlbWVudGluZyBwYXJ0bmVycyB3aXRoaW4gdGhlIDVXcy4gVGhleSBhcmUgZmFpcmx5IGV2ZW5seSBzcGxpdCB0aGVtc2VsdmVzIGJldHdlZW4gSFJQIGluZGljYXRvcnMsIHdpdGggYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMS4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGZvb2QgYW5kIGNhc2ggYXNzaXN0YW5jZSBhbmQgYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMi4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQuIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBmaWx0ZXIoYmVuZWZpY2lhcmllcyA8IDEwMDAwKSAlPiUgbnJvdygpYCBwYXJ0bmVycyBoYXZlIHJlYWNoZWQgbGVzcyB0aGFuIDEwLDAwMCB1bmlxdWUgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG1lZGlhbiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHBhcnRuZXJzIGlzIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSB7bWVkaWFuKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYC4gQmVsb3cgYXJlIHRoZSB0b3AgMTAgcGFydG5lcnMgYnkgSFJQIGluZGljYXRvci4gQXMgYSBzaWRlIG5vdGUsIFppZ3dheSBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBhIHZlbmRvci9zdXBwbGllciBvZiBXRlAsIGFuZCBub3QgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIC0tIHNvbWUgZm9sbG93IHVwIHdpdGggV0ZQIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHJlY3RpZnkgdGhpcy4NCg0KYGBge3IgdGFibGUtdG9wLXBhcnRuZXJzLWJ5LWhycC1pbmRpY2F0b3J9DQoNCiMgcmVtaW5kZXIgdG8gcmVkbyB0aGUgbnVtYmVycyB3aGVuIHlvdSByZXJ1biB0aGlzIHdpdGggZnJlc2ggZGF0YSANCg0KY2JpbmQoDQogIA0KICBiZW4gJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDEuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZWAgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICBgUGFydG5lcnMgSFJQIGluZGljYXRvcjFgID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgaGVhZCgxMCksDQogIA0KICBiZW4gJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgcmVuYW1lKGAyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0YCA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgIGBQYXJ0bmVycyBIUlAgaW5kaWNhdG9yMmAgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBoZWFkKDEwKQ0KICANCikgJT4lIA0KICBhZGRfY29sdW1uKGAgYCA9ICIgIikgJT4lIA0KICByZWxvY2F0ZShgIGAsIC5hZnRlciA9IGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIGJ5IEhSUCBpbmRpY2F0b3IiKQ0KDQpgYGANCg0KPGJyPg0KDQojIyMgMy4xIERpc3RyaWJ1dGlvbiBvZiBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIGFuZCBnZW9ncmFwaGljIHJlYWNoDQoNCldoaWxzdCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIHdlIGNhbiBzZWUgdGhhdCBwYXJ0bmVycycgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIGFyZSAtLSBvbiB0aGUgd2hvbGUgLS0gcXVpdGUgbGltaXRlZC4gT25seSBgciBiZW4gJT4lIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSBmaWx0ZXIodG93bnNoaXBzID4gMTApICU+JSBucm93KClgIHBhcnRuZXJzIGhhdmUgYSBwcmVzZW5jZSBpbiBtb3JlIHRoYW4gMTAgdG93bnNoaXBzLCB3aXRoIG9ubHkgYHIgYmVuICU+JSBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIGJlaW5nIHByZXNlbnQgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiA3OSUgb2Ygb3VyIHBhcnRuZXJzIChjbHVzdGVyZWQgYWxvbmcgdGhlIGJvdHRvbSBvZiB0aGUgY2hhcnQpIGFyZSBwcmVzZW50IGluIDUgb3IgbGVzcyB0b3duc2hpcHMuIFRoaXMgZGlzdHJpYnV0aW9uIG9mIHBhcnRuZXJzIGlzIGFuIGltcGVkaW1lbnQgdG8gYSBjb3VudHJ5d2lkZSByZXNwb25zZSBhbmQgaXQgaXMgaW1wZXJhdGl2ZSB0byB1bmRlcnN0YW5kIGhvdyBiZXN0IHRvIGluY2VudGl2aXNlIHBhcnRuZXJzIHRvIGV4cGFuZCB0aGVpciBmb290cHJpbnRzLg0KDQpgYGB7ciBwbG90bHktc2NhdHRlci1wYXJ0bmVycy1yZWFjaH0NCiMgcmVtaW5kZXIgdG8gcmVjYWxjdWxhdGUgdGhlIDc5JSBhYm92ZSBpZiB5b3UgcmVydW4gdGhlIGRhdGEgDQpwYXJ0bmVyX3NjYXR0ZXIgPC0gYmVuICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhzdGF0ZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSB0b3duc2hpcHMsIHRleHQgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSArICANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2ciLCBsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gYygwLCAxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgDQojIGZvciBzb21lIHJlYXNvbiwgcmVtb3ZpbmcgdGhpcyBtZXNzZXMgd2l0aCB0aGUgYWxpZ25tZW50IG9mIHRoZSBwbG90DQoNCmdncGxvdGx5KHBhcnRuZXJfc2NhdHRlcikgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zdXA+IikpKQ0KICANCmBgYA0KDQo8YnI+DQoNCiMjIyAzLjIgTWFwIG9mIG51bWJlciBvZiBwYXJ0bmVycyBhbmQgMjAyMiBwZW9wbGUgaW4gbmVlZCBieSBzdGF0ZS9yZWdpb24NCg0KDQpgYGB7ciBoYXMtcGFydG5lci1kYXRhc2V0fQ0KaGFzX3BhcnRuZXIgPC0gcGluICU+JSBzZWxlY3Qoc3RhdGUsIGFkbWluM19wY29kZSwgdG93bnNoaXAsIHBpbl8yMDIyKSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lICANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIG11dGF0ZShoYXNfcGFydG5lciA9IGlmZWxzZShwYXJ0bmVycyA9PSAwLCBGQUxTRSwgVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoaGFzX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKHBpbl8yMDIyID0gc3VtKHBpbl8yMDIyKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG4oKSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lIA0KICBtdXRhdGUocGluXzIwMjIgPSByb3VuZChwaW5fMjAyMiAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICB0b3duc2hpcHMgPSByb3VuZCh0b3duc2hpcHMgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KDQpgYGANCg0KRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGFyZSBub3Qgd2VsbC1wb3NpdGlvbmVkIHRvIG1lZXQgdGhlIG5lZWRzIG9mIHRoZSAyMDIyIHBvcHVsYXRpb24gaW4gbmVlZC4gUGFydG5lcnMgYXJlIGxhcmdlbHkgY29uY2VudHJhdGVkIGluIEthY2hpbiwgUmFraGluZSBhbmQgWWFuZ29uLCB3aXRoIG5vIHBhcnRuZXJzIHByZXNlbnQgaW4gVGFuaW50aGFyeWkgYW5kIEJhZ28gKFdlc3QpIGFuZCBvbmx5IG9uZSBwYXJ0bmVyIHByZXNlbnQgaW4gTWFnd2F5LCBCYWdvIChFYXN0KSBhbmQgU2hhbiAoRWFzdCkuIFRoZSBudW1iZXIgb2YgcGFydG5lcnMgaW4gQXllcnlhd2FkeSBpcyBhbHNvIHF1aXRlIGRpc3Byb3BvcnRpb25hdGUgd2l0aCB0aGUgbnVtYmVyIG9mIHBlb3BsZSBpbiBuZWVkIGluIHRoYXQgcmVnaW9uLiANCg0KT3ZlcmFsbCwgYHIgcm91bmQoaGFzX3BhcnRuZXIgJT4lIGZpbHRlcihoYXNfcGFydG5lciA9PSBGQUxTRSkgJT4lIHB1bGwodG93bnNoaXBzKSlgJSBvZiB0b3duc2hpcHMsIGNvbnRhaW5pbmcgYHIgcm91bmQoaGFzX3BhcnRuZXIgJT4lIGZpbHRlcihoYXNfcGFydG5lciA9PSBGQUxTRSkgJT4lIHB1bGwocGluXzIwMjIpKWAlIG9mIHRoZSAyMDIyIFBJTiwgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQuIFRoaXMgbGFjayBvZiBuYXRpb253aWRlIGNvdmVyYWdlIHdpbGwgYmUgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBjb25zdHJhaW50cyB0aGF0IHRoZSBGU0Mgd2lsbCBmYWNlIGluIG1lZXRpbmcgdGhlIDIwMjIgbmVlZHMgb2YgdnVsbmVyYWJsZSwgZm9vZCBpbnNlY3VyZSBwZXJzb25zIGFuZCBJRFBzIC0tIGFuZCByZXNvbHZpbmcgdGhpcyB3aWxsIG5lY2Vzc2l0YXRlIGluY3JlYXNpbmcgcGFydG5lciBjb3ZlcmFnZSBhbmQgZmluZGluZyBuZXcgcGFydG5lcnMgdGhlIGNsdXN0ZXIuDQoNCmBgYHtyIG1hcC1wYXJ0bmVycy1waW4tdG93bnNoaXAsIGZpZy5oZWlnaHQ9MTB9DQojIHBsYXkgd2l0aCBnZW9tX2xpbmUgZm9yIHRoZSBpbnRlcmFjdGl2ZSByZWZlcmVuY2UgbWFwIC0tIG1heWJlIHlvdSBjYW4gZ2V0IHRoZSBvdXRsaW5lcyB0byBiZSBpbiBkaWZmZXJlbnQgY29sb3Vycw0KDQpiZW4gJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBwYXJ0bmVycyksIHNpemUgPSAwLjEpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudCh0cmFucyA9ICJyZXZlcnNlIiwgYnJlYWtzID0gYygxLCAzLCA1LCA3LCA5KSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSkgKw0KICBsYWJzKHRpdGxlID0gIk1hcCBvZiBudW1iZXIgb2YgcGFydG5lcnMgYnkgdG93bnNoaXAiKSArDQoNCnBpbiAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoUElOID0gc3VtKHBpbl8yMDIyKSkgJT4lIA0KICBtdXRhdGUoUElOID0gcm91bmQoUElOLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICBQSU4gPSByZWNvZGUoUElOLCANCiAgICAgICAgICAgICAgICAgICAgICAnMCcgPSBOQV9yZWFsXykpICU+JQ0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gUElOKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gInJldmVyc2UiLCBicmVha3MgPSBjKDEwMDAwLCA1MDAwMCwgMTAwMDAwLCAxNTAwMDAsIDE4MDAwMCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSkgKw0KICBsYWJzKHRpdGxlID0gIk1hcCBvZiAyMDIyIFBJTiBieSB0b3duc2hpcCIpDQoNCmBgYA0KDQoNCg0KIyMjIDMuMyBSZXBvcnRpbmcgb3JnYW5pc2F0aW9ucw0KDQpUaGVyZSBhcmUgYHIgZnNjICU+JSBkaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBucm93KClgIGNvbWJpbmF0aW9ucyBiZXR3ZWVuIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zIGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lcnMsIGByIGZzYyAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gPT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgbnJvdygpYCBvZiB3aGljaCBhcmUgaW5zdGFuY2VzIHdoZXJlIHRoZSByZXBvcnRpbmcgb3JnYW5pc2F0aW9uIGFuZCB0aGUgaW1wbGVtZW50aW5nIHBhcnRuZXIgYXJlIHRoZSBzYW1lIG9yZ2FuaXNhdGlvbjsgb25jZSB0aGVzZSBhcmUgZmlsdGVyZWQgb3V0LCBhbGwgdGhlIHJlbWFpbmluZyBpbXBsZW1lbnRpbmcgcGFydG5lcnMgY29ycmVzcG9uZCB0byBqdXN0IGByIGZzYyAlPiUgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gIT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIG5yb3coKWAgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnM6DQoNCmBgYHtyIHRhYmxlLXJlcG9ydGluZy1vcmdhbmlzYXRpb259DQpmc2MgJT4lIA0KICBmaWx0ZXIocmVwb3J0aW5nX29yZ2FuaXphdGlvbiAhPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgZ3JvdXBfYnkocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gJ051bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbicpDQogIA0KYGBgDQoNClJlZ2FyZGluZyBxdWVzdGlvbnMgb2YgbWVtYmVyc2hpcCwgaXQgd291bGQgYmUgc2FmZSB0byBzYXkgdGhhdCBhbGwgcGFydG5lcnMgd2hvIHJlcG9ydGVkIGluIHRoZSA1V3MgLS0gYmUgdGhleSByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBvciBpbXBsZW1lbnRpbmcgcGFydG5lcnMgLS0gaW4gYWRkaXRpb24gdG8gc3RyYXRlZ2ljIHBhcnRuZXJzIGFuZCBwYXJ0bmVycyB3aG8gYWlkIGluIGFuYWx5c2lzIHdobyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoZSA1V3MsIGFyZSBGU0MgcGFydG5lcnMuIEhvd2V2ZXIsIGZvciB0aGlzIHJlcG9ydCwgd2UgaGF2ZSB1c2VkIGBpbXBsZW1lbnRpbmdfcGFydG5lcnNgIGZvciBtb3N0IG9mIHRoZSBhbmFseXNpcyBhcywgYnkgdGhlaXIgbmF0dXJlLCByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBkbyBub3QgaGF2ZSBhIGZpZWxkIHByZXNlbmNlLiBBcyBhIHNpZGUgbm90ZSwgRkFPIGhhcyBub3QgY2xhc3NpZmllZCBpdHNlbGYgYXMgYW4gaW1wbGVtZW50aW5nIHBhcnRuZXIsIGhhdmluZyByZXBvcnRlZCBubyBhY3Rpdml0aWVzIHRoYXQgd2VyZSBkaXJlY3RseSBpbXBsZW1lbnRlZCBieSB0aGVtLiANCg0KPGJyPg0KDQojIyMgMy40IFR5cGVzIG9mIHBhcnRuZXJzDQoNCmBgYHtyIHRhYmxlLWltcGxlbWVudGluZy1wYXJ0bmVyLXR5cGV9DQpmc2MgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgICAgIHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfYmVuZWZpY2lhcmllcyA9IG1lYW4oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBhdmdfdG93bnNoaXBzID0gbWVhbih0b3duc2hpcHMpLCANCiAgICAgICAgICAgIGF2Z19zdGF0ZXMgPSBtZWFuKHN0YXRlcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAgDQogIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgcmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSIpDQpgYGANCg0KVGhlcmUgaXMgbm8gcmVhbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGF2ZXJhZ2UgbnVtYmVycyBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgSU5HT3MgYW5kIE5OR09zOyBob3dldmVyLCB0aGUgZ2VvZ3JhcGhpY2FsIHJlYWNoIG9mIElOR09zIGlzIG1hcmtlZGx5IGdyZWF0ZXIsIHBlcmhhcHMgZHVlIHRvIHRoZSBtdWNoIHRpZ2h0ZXIgZ2VvZ3JhcGhpY2FsIGZvY3VzIG9mIHNldmVyYWwgY29tbXVuaXR5LWJhc2VkIG9yZ2FuaXNhdGlvbnMuIFRoZXJlIGlzIG9ubHkgb25lIGFnZW5jeSBpbiB0aGUgIlVOIiBjYXRlZ29yeSBmb3IgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSAtLSBXRlAuDQoNClRoZSBvbmx5IG5vdGFibGUgdGhpbmcgYWJvdXQgdGhlIGBkb25vcmAgY29sdW1uIGlzIGl0cyBpbmNvbXBsZXRlbmVzcywgd2hpY2ggaXMgdW5kZXJzdGFuZGFibGUgLS0gb25seSBgciByb3VuZChzdW0oKCFpcy5uYShmc2MkZG9ub3IpKSkgLyBucm93KGZzYykgKiAxMDAsIGRpZ2l0cyA9IDApYCUgKHJlcHJlc2VudGluZyBvbmx5IDEwJSBvZiBhbGwgcmVwb3J0ZWQgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMpIG9mIHRoZSByb3dzIGFyZSBmaWxsZWQuIEFkZGl0aW9uYWxseSwgd2UgYWxzbyBvYnNlcnZlIGEgbnVtYmVyIG9mIGVycm9ycywgaW5jbHVkaW5nIGNhc2VzIHdoZXJlIG11bHRpcGxlIGRvbm9ycyBoYXZlIGJlZW4gY29tYmluZWQgaW50byBvbmUgcm93IGFzIHdlbGwgYXMgbnVtZXJvdXMgaW5zdGFuY2VzIHdoZXJlIFdGUCwgRkFPIGFuZCBVTiBXT01FTiB3ZXJlIGNsYXNzaWZpZWQgYXMgZG9ub3JzIGFzIG9wcG9zZWQgdG8gcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMuIE5vdCBtdWNoIHVzZWZ1bCBhbmFseXNpcyBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhpcyBjb2x1bW4gYXQgcHJlc2VudC4NCg0KPGJyPjxicj4NCg0KIyMgNC4gQmVuZWZpY2lhcmllcw0KDQojIyMgNC4xIEJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucw0KDQpDdXJyZW50bHksIGluIHRoZSA1V3MsIHRoZSB2YXN0IG1ham9yaXR5IG9mIGJlbmVmaWNpYXJ5IGRpYXNhZ2dyZWdhdGlvbnMgaGF2ZSBiZWVuIGJhY2tmaWxsZWQgZnJvbSBjZW5zdXMgZGF0YSBhbmQgZG8gbm90LCBjb25zZXF1ZW50bHksIHByb3ZpZGUgYW4gYWNjdXJhdGUgcGljdHVyZSBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IGhhdmUgYmVlbiByZWFjaGVkIGJ1IEZvb2QgU2VjdXJpdHkgaW50ZXJ2ZW50aW9ucy4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgZmFyIHJlYWxpdHkgZGl2ZXJnZXMgZnJvbSB3aGF0IGhhcyBiZWVuIHJlcG9ydGVkIHNvIGZhciAtLSBtZWFuaW5nIHRoYXQgd2UgYWxzbyBjYW5ub3QgZGV0ZXJtaW5lIGlmIHRoZXJlIGhhcyBiZWVuIGFueSBiaWFzIGluIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBhbmQgdGFyZ2V0dGluZy4gSXQgaXMgaW1wZXJhdGl2ZSB0byBiZWdpbiBjb2xsZWN0aW5nIGRpc2FnZ3JlZ2F0ZWQgYmVuZWZpY2lhcnkgZGF0YSBmcm9tIHBhcnRuZXJzLiANCg0KSXQgaXMgZW50aXJlbHkgcG9zc2libGUgdGhhdCBwYXJ0bmVycyBhcmUgY29sbGVjdGluZyB0aGlzIGRhdGEgLS0gZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBkYXRhIGlzIG9uZSBvZiB0aGUgbW9zdCBjb21tb24gZGF0YSByZXF1aXJlZCBmb3IgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcG9ydGluZyAtLSBhbmQgdGhhdCBpdCBpcyBtZXJlbHkgbmVjZXNzYXJ5IHRvIHdvcmsgd2l0aCBwYXJ0bmVycyB0byB3cmFuZ2xlIHRoZWlyIGRhdGEgaW50byB0aGUgNVcgZm9ybWF0LiBIb3dldmVyLCB0aGUgY2FwYWNpdGllcyBvZiBwYXJ0bmVycyB0byBkaXNhZ2dyZWdhdGUgYmVuZWZpY2lhcnkgZGF0YSBzaG91bGQgYmUgaW52ZXN0aWdhdGVkIGJ5IHRoZSBjbHVzdGVyIGFuZCBpcyBhbiBpbXBvcnRhbnQgaXNzdWVzIHRoYXQgc2hvdWxkIGJlIGJyb3VnaHQgdXAgaW4gdGUgbmV4dCBwbGVuYXJ5IHNlc3Npb24uIA0KDQo8YnI+DQoNCiMjIyA0LjIgVHlwZXMgb2YgYmVuZWZpY2lhcmllcw0KDQpgYGB7ciBiZW5lZmljaWFyeS10eXBlLWRhdGFzZXR9DQpiZW5fdHlwZSA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGFkb3JuX3BlcmNlbnRhZ2VzKGRlbm9taW5hdG9yID0gImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNCg0KVGhlIHN0YXRlcyBhbmQgc3ViLXJlZ2lvbnMgaW4gd2hpY2ggd2UgYXJlIHdvcmtpbmcgdGhlIG1vc3Qgd2l0aCBJRFBzIGFyZSBCYWdvIChFYXN0KSwgS2FjaGluLCBDaGluLCBTaGFuIChOb3J0aCkgYW5kIEtheWFoLiBPdmVyYWxsLCBgciBiZW5fdHlwZSAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcylgJSBvZiBiZW5lZmljaWFyaWVzIGFyZSBmcm9tIHRoZSBob3N0L2xvY2FsIGNvbW11bml0eSwgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJSYWtoaW5lIHN0YXRlbGVzcyIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgYXJlIHN0YXRlbGVzcyBwZXJzb25zIGZyb20gUmFraGluZSBhbmQgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgYXJlIElEUHMuIFJldHVybmVlcyBhcmUgdGhlIHJhcmVzdCB0eXBlIG9mIGJlbmVmaWNpYXJ5IHJlYWNoZWQsIGZvcm1pbmcgb25seSBgciBiZW5fdHlwZSAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIlJldHVybmVlcyIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gRWFjaCByb3cgaW4gdGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIGVhY2ggYmVuZWZpY2lhcnkgdHlwZSB3aXRoaW4gZWFjaCBzdGF0ZS9yZWdpb24uIA0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyeS10eXBlcy1zdGF0ZX0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMod2hlcmUgPSAicm93IiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKGRlbm9taW5hdG9yID0gInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhgSG9zdC9sb2NhbCBDb21tdW5pdHlgLCBgSW50ZXJuYWxseSBEaXNwbGFjZWRgLCBgUmV0dXJuZWVzYCwgYFJha2hpbmUgc3RhdGVsZXNzYCksIA0KICAgICAgICAgICAgLmZ1bnMgPSBsaXN0KH4gcm91bmQoLiAqIDEwMCwgZGlnaXRzID0gMikpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChgSG9zdC9sb2NhbCBDb21tdW5pdHlgID0gMCwgYEludGVybmFsbHkgRGlzcGxhY2VkYCA9IDAsIGBSZXR1cm5lZXNgID0gMCwgYFJha2hpbmUgc3RhdGVsZXNzYCA9IDApKSAlPiUgIA0KICBsZWZ0X2pvaW4oZnNjICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoc3RhdGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gInN0YXRlIikgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJ5IHR5cGVzIGJ5IHN0YXRlL3JlZ2lvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQoNCmBgYA0KDQo8YnI+DQoNCkNvbXBhcmVkIHRvIG9ubHkgdGhlIDIwMjEgSFJQIHRhcmdldHMgKGFzIHRoZSBJRVJQIGRvZXMgbm90IGhhdmUgYnJlYWtkb3ducyBvZiB0aGUgdGFyZ2V0IGJ5IGJlbmVmaWNpYXJ5IHR5cGUpLCB3ZSBjYW4gc2VlIHRoYXQgd2hpbHN0IHRhcmdldHMgaGF2ZSBiZWVuIG1vc3RseSBleGNlZWRlZCwgbmVpdGhlciB0aGUgdGFyZ2V0cyBmb3IgcmV0dXJuZWVzL3Jlc2V0dGxlZCBpbiBLYWNoaW4gb3IgU2hhbiAoTm9ydGgpIG5vciB0YXJnZXRzIGZvciBJRFBzIGluIFJha2hpbmUgb3IgS2F5aW4gaGF2ZSBiZWVuIG1ldC4gSW50ZXJlc3RpbmdseSwgZm9yIFJha2hpbmUsIHRoZSB0YXJnZXRzIGZvciB0aGUgaG9zdC9sb2NhbCBwb3B1bGF0aW9uIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkLiBJbiBCYWdvIChFYXN0KSwgQ2hpbiwgYW5kIHBhcnRpY3VsYXJseSBTaGFuIChOb3J0aCksIHRoZSB0YXJnZXRzIGZvciBJRFBzIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkLCBpbiBjb21wYXJpc29uIHRvIHRoZSAyMDIxIEhSUCB0YXJnZXRzOg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyeS10eXBlLXJlYWNoZWQtaHJwLXRhcmdldH0NCiMgcmVtaW5kZXIgdG8gY2hlY2sgdGhlIHRleHQgaW4gdGhlIHBhcmFncmFwaCBhYm92ZSB3aGVuIHlvdSByZXJ1biB0aGUgcmVwb3J0IHdpdGggZGF0YQ0KcGluICU+JQ0KICBmaWx0ZXIoaHJwX3RhcmdldF90b3RhbCA+IDApICU+JSANCiAgc2VsZWN0KHN0YXRlLCBhZG1pbjNfcGNvZGUsIGhycF90YXJnZXRfaWRwc18yMDIxLCBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxLCBocnBfdGFyZ2V0X3N0YXRlbGVzc19yYWtoaW5lXzIwMjEsIA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEsIGhycF90YXJnZXRfdG90YWwpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUodG90YWxfYmVuZWZpY2lhcmllcyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhocnBfdGFyZ2V0X2lkcHNfMjAyMTp0b3RhbF9iZW5lZmljaWFyaWVzKSwgfnN1bSguKSkgJT4lIA0KICBtdXRhdGUoaG9zdF9sb2NhbF9wYyA9IGhvc3RfbG9jYWxfY29tbXVuaXR5IC8gaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEgKiAxMDAsIA0KICAgICAgICAgaWRwX3BjID0gaW50ZXJuYWxseV9kaXNwbGFjZWQgLyBocnBfdGFyZ2V0X2lkcHNfMjAyMSAqIDEwMCwNCiAgICAgICAgIHJldHVybmVlc19wYyA9IHJldHVybmVlcyAvIGhycF90YXJnZXRfcmV0dXJuZWVzXzIwMjEgKiAxMDAsDQogICAgICAgICByYWtoaW5lX3N0YXRlbGVzc19wYyA9IHJha2hpbmVfc3RhdGVsZXNzIC8gaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxICogMTAwLA0KICAgICAgICAgdG90YWxfcGMgPSB0b3RhbF9iZW5lZmljaWFyaWVzIC8gaHJwX3RhcmdldF90b3RhbCAqIDEwMCkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIGhvc3RfbG9jYWxfcGMsIGlkcF9wYywgcmV0dXJuZWVzX3BjLCByYWtoaW5lX3N0YXRlbGVzc19wYywgdG90YWxfcGMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhob3N0X2xvY2FsX3BjLCBpZHBfcGMsIHJldHVybmVlc19wYywgcmFraGluZV9zdGF0ZWxlc3NfcGMsIHRvdGFsX3BjKSwgfiByZXBsYWNlKC4sIGlzLm5hbiguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcmVwbGFjZSguLCBpcy5pbmZpbml0ZSguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcm91bmQoLiwgZGlnaXRzID0gMikpICU+JQ0KICByZW5hbWUoYGhvc3RfbG9jYWwlYCA9IGhvc3RfbG9jYWxfcGMsDQogICAgICAgICBgaWRwJWAgPSBpZHBfcGMsDQogICAgICAgICBgcmV0dXJuZWVzJWAgPSByZXR1cm5lZXNfcGMsDQogICAgICAgICBgcmFraGluZV9zdGF0ZWxlc3MlYCA9IHJha2hpbmVfc3RhdGVsZXNzX3BjLA0KICAgICAgICAgYHRvdGFsJWAgPSB0b3RhbF9wYykgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJQZXJjZW50YWdlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUiKQ0KDQogIA0KYGBgDQogDQo8YnI+DQoNClN0YXRlbGVzcyBwZXJzb25zIGZyb20gUmFraGluZSBoYXZlIHRoZSBsYXJnZXN0IGF2ZXJhZ2UgaG91c2Vob2xkIHNpemVzLCBhbmQgdGhlIGxhcmdlc3QgdmFyaWF0aW9ucyBpbiBob3VzZWhvbGQgc2l6ZS4gVGhlIHRoaWNrIGJhciBpbiB0aGUgbWlkZGxlIG9mIGVhY2ggYm94IHNob3dzIHRoZSBhdmVyYWdlIGhvdXNlaG9sZCBzaXplIGZvciBlYWNoIGJlbmVmaWNpYXJ5IHR5cGUgLS0gdGhpcyB2YWx1ZSBpcyBhbHNvIHNob3duIGluIHRoZSB0ZXh0IGxhYmVsIGJlbG93IHRoZSBsaW5lLiBUaGUgbG93ZXIgYW5kIHVwcGVyIGJvcmRlcnMgb2YgZWFjaCBib3ggaW5kaWNhdGUgdGhlIHZhbHVlcyBmb3IgdGhlIDI1dGggYW5kIDc1dGggcGVyY2VudGlsZXMgcmVzcGVjdGl2ZWx5LiBGb3IgaW5zdGFuY2UsIHdlIGNhbiBzZWUgdGhhdCBob3VzZWhvbGRzIGF0IHRoZSAyNXRoIHBlcmNlbnRpbGUgb2YgaG91c2Vob2xkcyBpbiBob3N0L2xvY2FsIGNvbW11bml0aWVzIGhhdmUgb25seSBvbmUgbWVtYmVyIGFuZCBob3VzZWhvbGRzIHRoYXQgaGF2ZSBhcm91bmQgNSBtZW1iZXJzIGhhdmUgbW9yZSBtZW1iZXJzIHRoYW4gNzUlIG9mIGFsbCB0aGUgaG91c2Vob2xkcyBpbiB0aGF0IGdyb3VwLiBPdXRsaWVycyBhcmUgbWFya2VkIGJ5IGRvdHMuIFdlIG5vdGUgYSBsb3Qgb2YgcG90ZW50aWFsIGRhdGEgZW50cnkgZXJyb3JzIHdoZXJlIGxlc3MgdGhhbiBvbmUgcGVyc29uIHBlciBob3VzZWhvbGQgaGF2ZSBiZWVuIHJlY29yZGVkLiANCg0KPGJyPg0KDQpgYGB7ciBib3hwbG90LWhvdXNlaG9sZC1zaXplLWJlbmVmaWNpYXJ5LXR5cGV9DQoNCiMgdGhpcyBpcyBmb3IgdGhlIGxhYmVscyBmb3IgdGhlIGJveHBsb3QNCmhoZF9sYWJzIDwtIGZzYyAlPiUgIA0KICBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSAhPSAiTkEiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShhdmdfaGhkX3NpemUgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gaG91c2Vob2xkcywgZGlnaXRzID0gMikpICANCiANCg0KIyBmb3Igc29tZSByZWFzb24sIHRoZSBtdXRhdGUgZmN0X3Jlb3JkZXIgaXMgbm90IHdvcmtpbmcNCiMgeW91IGZpZ3VyZWQgdGhpcyBvdXQgYnV0IGhhdmUgbmVnbGVjdGVkIHRvIHdyaXRlIHRoZSBhbnN3ZXIgaGVyZSANCiANCmZzYyAlPiUgDQogIGZpbHRlcihiZW5lZmljaWFyeV90eXBlICE9ICJOQSIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBtdXRhdGUoYXZnX2hoZF9zaXplID0gYmVuZWZpY2lhcmllcyAvIGhvdXNlaG9sZHMsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBhdmdfaGhkX3NpemUpLCB5ID0gYXZnX2hoZF9zaXplKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZW9tX3RleHQoZGF0YSA9IGhoZF9sYWJzLCBhZXMobGFiZWwgPSBhdmdfaGhkX3NpemUpLCBzaXplID0gMi41KSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTQsIDIpLCBsaW1pdHMgPSBjKDAsMTQpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUiLA0KICAgICAgIHRpdGxlID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUgYnkgYmVuZWZpY2lhcnkgdHlwZXMiKQ0KDQpgYGANCg0KDQo8YnI+DQoNCiMjIyA0LjMgQmVuZWZpY2lhcmllcyBieSBhY3Rpdml0eSBmcmVxdWVuY3kNCg0KVGhlIGNhdGVnb3JpZXMgIkZpcnN0IiBhbmQgIk1vbnRobHkiIGluIHRoZSBmcmVxdWVuY3kgY29sdW1uIGRvIG5vdCBzZWVtIHRvIGJlIGZpbGxlZCBhcyBpbnRlbmRlZCwgYXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgcGxvdCBiZWxvdzoNCg0KPGJyPg0KDQpgYGB7ciBsaW5lLXBsb3QtZmlyc3QtbW9udGhseX0NCg0KZnNjICU+JSANCiAgZmlsdGVyKGZyZXF1ZW5jeSA9PSAiRmlyc3QiIHwgZnJlcXVlbmN5ID09ICJNb250aGx5IikgJT4lIA0KICBncm91cF9ieShkYXRlLCBmcmVxdWVuY3kpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGJlbmVmaWNpYXJpZXMsIGNvbG91ciA9IGZyZXF1ZW5jeSkpICsgDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJCZW5lZmljaWFyaWVzIiwNCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgZnJlcXVlbmN5IC0tIGNvbXBhcmlzb24gYmV0d2VlbiAnRmlyc3QnIGFuZCAnTW9udGhseSciKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkNCg0KYGBgDQoNClRoZSBhc3N1bXB0aW9uIGZvciB0aGVzZSBjYXRlZ29yaWVzIGlzIHRoYXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgYmVuZWZpY2lhcnkgcmVjZWl2aW5nIHN1cHBvcnQgKGFzIHBhcnQgb2YgYSBjb250aW51aW5nIG1vbnRobHkgc3VwcG9ydCBwYWNrYWdlKSB3b3VsZCBmYWxsIHVuZGVyIHRoZSBjYXRlZ29yeSAiRmlyc3QiIGFuZCBldmVyeSBzdWJzZXF1ZW50IHRpbWUgdGhleSByZWNlaXZlZCBzdXBwb3J0LCBpdCB3b3VsZCBiZSB1bmRlciAiTW9udGhseSIuIA0KDQpCdXQgd2UgY2FuIHNlZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBjYXNlIC0tIG1vbnRobHkgYmVuZWZpY2lhcmllcyBwcmVkYXRlZCB0aGUgdXNlIG9mIHRoZSAiRmlyc3QiIGNhdGVnb3J5IGJ5IGF0IGxlYXN0IGZvdXIgbW9udGhzOyBmdXJ0aGVybW9yZSwgdGhlIHNwaWtlIGluIGZpcnN0LXRpbWUgYmVuZWZpY2lhcmllcyBpbiBNYXkgMjAyMSB3YXMgbm90IGFjY29tcGFuaWVkIGJ5IGFueSBpbmNyZWFzZSBpbiBtb250aGx5IGJlbmVmaWNpYXJpZXMgaW4gdGhlIHN1YnNlcXVlbnQgbW9udGhzIC0tIGluIGZhY3QsIHRoZXJlIHdhcyBhIGRlY2xpbmUgaW4gbW9udGhseSBiZW5lZmljaWFyaWVzLiBDb21wbGljYXRpbmcgYWxsIHRoaXMgaXMgdGhhdCB3ZSBhcmUgbm90IHN1cmUgd2hpY2ggb2YgdGhlIGJlbmVmaWNpYXJpZXMgdHJhY2sgYmVuZWZpY2lhcmllcyBpbiBhIGNvbXByZWhlbnNpdmUgbWFubmVyIGkuZS4gd2l0aCBhIGJlbmVmaWNpYXJ5IGRhdGFiYXNlIGFuZCBiZW5lZmljaWFyeSBJRCBjYXJkcy4gQWxsIHRoaXMgaW5kaWNhdGVzIHRoYXQgLS0gYWZ0ZXIgY29uZmlybWluZyB0aGlzIHdpdGggcGFydG5lcnMgLS0gd2Ugc2hvdWxkIGFiYW5kb24gdGhlICJGaXJzdCIgY2F0ZWdvcnkgYW5kIHJlY29kZSB0aGVzZSBlbnRyaWVzIGFzICJPbmUtb2ZmIi4NCg0KDQo8YnI+DQoNCiMjIyA0LjQgR2FwcyBpbiBtb250aGx5IHByb2dyYW1taW5nDQoNCmBgYHtyIHRhYmxlLWdhcHMtbW9udGhzfQ0KIyBJIGZlZWwgbGlrZSB0aGlzIGlzIHRoZSBtb3N0IGluZWZmaWNpZW50IHdheSB0byBkbyB0aGlzOyBzdGlsbCB3b3JrcywgdGhvdWdoIA0KZ2FwX21vbnRocyA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoZnJlcXVlbmN5ID09ICJNb250aGx5IiAmIGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGltcGxlbWVudGluZ19wYXJ0bmVycywgYWN0aXZpdHksIHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRhdGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICB1bm5lc3QoKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShyZWN1cnJlbmNlcyA9IHJvd1N1bXMoIWlzLm5hKHNlbGVjdCguLCAtaW1wbGVtZW50aW5nX3BhcnRuZXJzLCAtYWN0aXZpdHksIC1zdGF0ZSwgLXRvd25zaGlwLCAtbG9jYXRpb24pKSksDQogICAgICAgICBiZW5fbWF4ID0gcG1heChgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCksIG5hbWVzX3RvID0gImRhdGUiLCB2YWx1ZXNfdG8gPSAiYmVuZWZpY2lhcmllcyIpICU+JSANCiAgbXV0YXRlKGRpc3RyaWJ1dGlvbiA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgIm4iLCAieSIpKSAlPiUgDQogIHNlbGVjdCgtYmVuZWZpY2lhcmllcykgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0ZSwgdmFsdWVzX2Zyb20gPSBkaXN0cmlidXRpb24pICU+JSANCiAgbXV0YXRlKGdhcHMgPSBwYXN0ZTAoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWApKSAlPiUgDQogIG11dGF0ZShnYXBfbW9udGhzID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm55IikgfiA2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm55IikgfiA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubnkiKSB+IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm55IikgfiAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm55IikgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bnkiKSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgDQoNCiMjIGNvbW1lbnRlZCBvdXQsIGJ1dCB0aGlzIHdhcyBqdXN0IHRvIGdldCB0aGUgbnVtYmVyIG9mIHRvd25zaGlwcyB3aXRoIGdhcHMgcGVyIHN0YXRlDQojIGdhcF9tb250aHMgJT4lIA0KIyAgIGZpbHRlcihyZWN1cnJlbmNlcyA+IDEpICU+JSANCiMgICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiMgICBzdW1tYXJpc2UoYXZnX2dhcCA9IG1lYW4oZ2FwX21vbnRocyksIA0KIyAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbl9tYXgpKSAlPiUgDQojICAgYXJyYW5nZShkZXNjKGF2Z19nYXApKSAlPiUNCiMgICBmaWx0ZXIoYXZnX2dhcCA+IDApICU+JSANCiMgICBncm91cF9ieShzdGF0ZSkgJT4lDQojICAgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QodG93bnNoaXApKQ0KDQpnYXBfbW9udGhzICU+JSANCiAgZmlsdGVyKHJlY3VycmVuY2VzID4gMSkgJT4lIA0KICBncm91cF9ieShnYXBfbW9udGhzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QodG93bnNoaXApLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kIGxvY2F0aW9ucyBieSBkdXJhdGlvbiBvZiBnYXBzIGluIGltcGxlbWVudGF0aW9uIikNCg0KIyByZW1pbmRlciB0byBjaGVjayB0aGUgcGFyYWdyYXBoIGJlbG93IHdoZW4geW91IHJlcnVuIHRoZSByZXBvcnQNCg0KYGBgDQoNCjc1JSBvZiBiZW5lZmljaWFyaWVzIGV4cGVyaWVuY2VkIG5vIGdhcHMgaW4gbW9udGhseSBwcm9ncmFtbWluZyBhbmQgdmVyeSBsb25nIGdhcHMgb2YgNCBvciA1IG1vbnRocyBhcmUgcXVpdGUgcmFyZTsgb2YgdGhlIGJlbmVmaWNpYXJpZXMgd2hvIGRpZCBleHBlcmllbmNlIGdhcHMgaW4gbW9udGhseSBjb3ZlcmFnZSwgbW9zdCBleHBlcmllbmNlZCBnYXBzIG9mIDEtMiBtb250aHMuIFRoZSAxMCB0b3duc2hpcHMgd2hpY2ggZXhwZXJpZW5jZWQgdGhlIGxvbmdlc3QgYXZlcmFnZSBnYXBzIGJldHdlZW4gIm1vbnRobHkiIGFjdGl2aXRpZXMgd2VyZTogTW9obnlpbiwgTXlpdGt5aW5hLCBIcGFrYW50LCBNb2dhdW5nLCBDaGlwd2kgYW5kIFdhaW5nbWF3IGluIEthY2hpbjsgU2h3ZXB5aXRoYXIgaW4gWWFuZ29uOyBEZW1vc28gYW5kIExvaWthdyBpbiBLYXlhaDsgYW5kIEt1dGthaSBpbiBTaGFuLiBPdmVyYWxsLCAxMiB0b3duc2hpcHMgaW4gS2FjaGluIGV4cGVyaWVuY2VkIGdhcHMgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIG1vbnRobHkgYWN0aXZpdGllczsgNiBpbiBSYWtoaW5lOyAyIGVhY2ggaW4gQXlleWFyd2FkeSwgS2F5YWggYW5kIFNoYW47IGFuZCAxIGluIFlhbmdvbi4gSXQgc2hvdWxkIGJlIGV4cGxvcmVkIHdoZXRoZXIgdGhlIGRlbGF5cyBpbiB0aGVzZSBhcmVhcyB3ZXJlIGR1ZSB0byBhY2Nlc3MgaXNzdWVzIG9yIG90aGVyIG90aGVyIGNvbnN0cmFpbnRzLiANCg0KVGhlcmUgYXJlIDE2NyBlbnRyaWVzIGNvZGVkIGFzIGJlaW5nIGltcGxlbWVudGVkIG9uIGEgbW9udGhseSBiYXNpcyB0aGF0IGhhdmUgbm90IHJlY3VycmVkIC0tIHRoYXQgaXMsIHRoZXkgaGF2ZSBvbmx5IGJlZW4gaW1wbGVtZW50ZWQgb25jZTogd2Ugc2hvdWxkIGNoZWNrIHdpdGggcGFydG5lcnMgaWYgdGhlc2UgYXJlIG1lcmVseSB0aGUgZmlyc3QgaW5zdGFuY2VzIG9yIGlmIHRoZXkgYXJlIGVycm9ycyBpbiBkYXRhIGVudHJ5IG9yIGlmIHRoZXJlIGhhdmUgYmVlbiBpc3N1ZXMgd2l0aCBhY2Nlc3MsIHNlY3VyaXR5IG9yIGZ1bmRpbmcuIA0KDQo8YnI+DQoNCiMjIyA0LjUgUG90ZW50aWFsIGZvciBwb3N0LWRpc3RyaWJ1dGlvbiBtb25pdG9yaW5nDQoNClRoZSB0YWJsZSBiZWxvdyBzaG93cyBhY3Rpdml0aWVzIHdoaWNoIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBmb3IgNiBtb250aHMgb3IgbW9yZSwgdGhlIG51bWJlciBvZiBsb2NhdGlvbnMgdGhleSB3ZXJlIGltcGxlbWVudGVkIGluIGFuZCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgYWN0aXZpdGllcyBtZWV0aW5nIHRoZXNlIGNyaXRlcmlhLiBUaGUgcG9zc2liaWxpdHkgb2Ygam9pbnQgbW9uaXRvcmluZyAtLSBvciBhdCBsZWFzdCB0aGUgam9pbnQgcmV2aWV3IGFuZCBhbmFseXNpcyBvZiBtb25pdG9yaW5nIGRhdGEgLS0gd2lsbCBiZSBleHBsb3JlZCwgaW4gY29uc3VsdGF0aW9uIHdpdGggdGhlc2UgcGFydG5lcnMuIFRoZSByYXRpb25hbGUgYmVpbmcgdGhhdCA2IG1vbnRocyBvZiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgYSBsb25nIGVub3VnaCBwZXJpb2Qgb2YgdGltZSB0byBtYWtlIGltcGFjdCBtb25pdG9yaW5nIGZlYXNpYmxlOyBhZGRpdGlvbmFsbHksIGpvaW50IG1vbml0b3Jpbmcgd2lsbCBiZSBmdXJ0aGVyIGZhY2lsaXRhdGVkIGJ5IHRoZSBzaW1pbGFyaXR5IG9mIHRoZXNlIGFjdGl2aXRpZXMsIGFsbW9zdCBhbGwgb2Ygd2hpY2ggYXJlIHJlY3VycmVudCBjYXNoIHRyYW5zZmVycyBvciBkaXN0cmlidXRpb25zIG9mIGZvb2QgYmFza2V0cy4gDQoNCg0KYGBge3IgdGFibGUtbW9udGhseS1hY3Rpdml0aWVzLTYtOS1tb250aHMsIHdhcm5pbmc9RkFMU0V9DQoNCmZzYyAlPiUgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIk1vbnRobHkiICYgYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgc2VsZWN0KGRhdGUsIGltcGxlbWVudGluZ19wYXJ0bmVycywgYWN0aXZpdHksIHRvd25zaGlwLCBsb2NhdGlvbiwgYmVuZWZpY2lhcmllcykgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0ZSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIHVubmVzdCgpICU+JSANCiAgbXV0YXRlKHJlY3VycmVuY2VzID0gcm93U3VtcyghaXMubmEoc2VsZWN0KC4sIC1pbXBsZW1lbnRpbmdfcGFydG5lcnMsIC1hY3Rpdml0eSwgLXRvd25zaGlwLCAtbG9jYXRpb24pKSksDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcG1heChgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIocmVjdXJyZW5jZXMgPiA1KSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IG4oKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIk51bWJlciBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyB3aGljaCBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IDYgbW9udGhzIG9mIHJlY3VycmVudCBmb29kIHNlY3VyaXR5IHN1cHBvcnQiKQ0KDQpgYGANCg0KDQoNClRoZSBwYXJ0bmVycyB3aGljaCBoYXZlIGltcGxlbWVudGVkIGFjdGl2aXRpZXMgZml0dGluZyB0aGVzZSBjcml0ZXJpYSBhcmUgV0ZQLCBLYXJ1bmEgTWlzc2lvbiBTb2NpYWwgU29saWRhcml0eSwgV29ybGQgVmlzaW9uIE15YW5tYXIsIE15YW5tYXIgT3BlbiBIZWFydCBEZXZlbG9wbWVudCBPcmdhbmlzYXRpb24sIFBlb3BsZSBmb3IgUGVvcGxlIGFuZCBQbGFuIEludGVybmF0aW9uYWwgZm9yIG1vbnRobHkgY2FzaCB0cmFuc2ZlcnM7IFdvcmxkIFZpc2lvbiBNeWFubWFyLCBNeWFubWFyIE9wZW4gSGVhcnQgRGV2ZWxvcG1lbnQgT3JnYW5pc2F0aW9uLCBBY3Rpb24gZm9yIEdyZWVuIEVhcnRoLCBQZW9wbGUgSG9wZSBDb21tdW5pdHkgRGV2ZWxvcG1lbnQgKFBIQ0QpLCBUb2dldGhlciBmb3IgU3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQsIEthcnVuYSBNaXNzaW9uIFNvY2lhbCBTb2xpZGFyaXR5IGFuZCBXRlAgZm9yIG1vbnRobHkgZm9vZCBiYXNrZXRzOyBhbmQgdGhlIERhLU51IE5hdGlvbmFsIEFmZmFpcnMgT3JnYW5pc2F0aW9uIChETkFPKSBmb3IgdGVjaG5pY2FsIHRyYWluaW5nLiANCg0KDQoNCjxicj48YnI+DQoNCiMjIDUuIE5leHQgc3RlcHMNCg0KMS4gIENvbW11bmljYXRlIHRvIHBhcnRuZXJzIHRoYXQgWWFuZ29uIGlzIHNldmVyZWx5IG92ZXJzdWJzY3JpYmVkIGluIGNvbXBhcmlzb24gdG8gdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnksIGFib3ZlIGFsbCBpbiB0aGUgdG93bnNoaXBzIG9mIEhsYWluZ3RoYXJ5YSwgRGFnb24gTXlvdGhpdCAoU2Vpa2thbiksIGFuZCBEYWxhLg0KDQoyLiAgQ29sbGVjdCBleGlzdGluZyBpbnRlcnZlbnRpb24gcGFja2FnZXMgZnJvbSBwYXJ0bmVycyBpbiBvcmRlciB0byBiZWdpbiB0aGUgcHJvY2VzcyBvZiBzdGFuZGFyZGlzYXRpb24gYW5kIHRvIHN1cHBvcnQgdGhlIHJldmlldyBvZiBmb29kIGJhc2tldHMgZm9yIHRoZWlyIGNhbG9yaWMgYW5kIG51dHJpdGlvbmFsIHZhbHVlLiBQZXJmb3JtIGFkZGl0aW9uYWwgYW5hbHlzaXMgdG8gdW5kZXJzdGFuZCBpZiBiZW5lZmljaWFyaWVzIGluIGNsb3NlIHByb3hpbWl0eSB0byBlYWNoIG90aGVyIGhhdmUgcmVjZWl2ZWQgd2lkZWx5IGRpdmVyZ2VudCBwYWNrYWdlIHZhbHVlcy4gQWRkaXRpb25hbGx5LCBzcGVhayB3aXRoIHBhcnRuZXJzIHRvIHVuZGVyc3RhbmQgd2h5IGNhc2ggdHJhbnNmZXIgdmFsdWVzIHZhcnkgYnkgc28gbXVjaCBldmVuIHdpdGhpbiB0aGUgc2FtZSBhY3Rpdml0eSBpbXBsZW1lbnRlZCBieSB0aGUgc2FtZSBwYXJ0bmVyLiANCg0KMy4gUmV2aXNpdCBhcmVhcyB3aGljaCBoYXZlIG9ubHkgcmVjZWl2ZWQgc21hbGxlciBzdXBwbGVtZW50YXJ5IHRyYW5zZmVycyAtLSBhIHRyYW5zZmVyIG9mIGFyb3VuZCBVU0QgMTAgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGggY2Fubm90IGJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBjb3ZlcmVkIHRoZSBmb29kIHNlY3VyaXR5IG5lZWRzIGZvciB0aGF0IGFyZWEgLS0gb3RoZXIgcGFydG5lcnMgbWF5IGJlIG5lY2Vzc2FyeSB0byBjb3ZlciB0aGUgZ2FwLiANCg0KNC4gQWR2b2NhdGUgZm9yIHRoZSBleHBhbnNpb24gb2YgcGFydG5lcnMnIGdlb2dyYXBoaWMgZm9vdHByaW50cyB0byByZWFjaCB0aGUgcmVtYWluaW5nIDIxMyB0b3duc2hpcHMgd2hpY2ggaGF2ZSB5ZXQgdG8gYmVuZWZpdCBmcm9tIGFueSBGU0MgYWN0aXZpdGllcy4gVGhlIGVmZmVjdHMgb2YgdGhlIGN1cnJlbnQgY3Jpc2lzIGluIE15YW5tYXIgaGF2ZSBub3QgYmVlbiBkZXRlcm1pbmVkIGJ5IGFuIGVwaWNlbnRyZSBvciBhIHN0b3JtcGF0aCBhbmQgdGhlcmUgaXMgbm8gcHJvZ3JhbW1hdGljIHJhdGlvbmFsZSBmb3IgdGhlIHJlc3BvbnNlIHRvIGJlIHNvIHVuZXZlbi4gVGhpcyBhZHZvY2FjeSBzaG91bGQgYmUgdGFyZ2V0dGVkIGF0IHRoZSBJQ0NHLCBDbHVzdGVyIHBhcnRuZXJzLCBvdGhlciBDbHVzdGVycyBhbmQgYXQgZG9ub3JzLiANCg0KNS4gQ29sbGVjdCA1VyBkYXRhIGZyb20gb3RoZXIgY2x1c3RlcnMgc28gdGhhdCBtdWx0aS1zZWN0b3IgY292ZXJhZ2UgbWF5IGJlIHJldmlld2VkLiBDbGVhbiBhbmQgcHJvY2VzcyBjb25mbGljdCBkYXRhIHNvIHRoYXQgaXQgbWF5IGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCBwYXJ0bmVycycgY292ZXJhZ2UuIA0KDQo2LiBXb3JrIHdpdGggcGFydG5lcnMgdG8gZGV0ZXJtaW5lIHRoZWlyIGN1cnJlbnQgY2FwYWNpdGllcyB0byBzdWJtaXQgYWdlIGFuZCBzZXgtZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBkYXRhLiBEZXZlbG9wIGEgd29ya3BsYW4gdG8gZW5zdXJlIHRoYXQgdGhleSBjYW4gbWVldCByZXBvcnRpbmcgcmVxdWlyZW1lbnRzLiANCg0KNy4gU29saWNpdCBtb25pdG9yaW5nIHJlcG9ydHMgZnJvbSBwYXJ0bmVycyBhbmQgZXhwbG9yZSB0aGUgcG9zc2liaWxpdHkgb2Ygam9pbnQgbW9uaXRvcmluZy4gDQoNCjguIFJldmlzZSB0aGUgNVcgdGVtcGxhdGUgLS0gaW4gY29uc3VsdGF0aW9uIHdpdGggcGFydG5lcnMgLS0gaW4gb3JkZXIgdG8gYWRkcmVzcyB0aGUgZGF0YSBjb2xsZWN0aW9uIGlzc3VlcyBpZGVudGlmaWVkLiANCg0KPGJyPjxicj4NCg0KIyMgNi4gUmVmZXJlbmNlIHRhYmxlIC0tIHRvd25zaGlwLWxldmVsDQoNCmBgYHtyIGRhdGF0YWJsZS10b3duc2hpcHMtcmVmZXJlbmNlfQ0KIyBhZGQgaW4gdGFyZ2V0DQpwaW4gJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCBhZG1pbjNfcGNvZGUsIHRvdGFsX3BvcCwgUElOXzIwMjIgPSBwaW5fMjAyMiwgSURQcyA9IGlkcHMpICU+JSANCiAgbXV0YXRlKHRvdGFsX3BvcCA9IHJvdW5kKHRvdGFsX3BvcCwgZGlnaXRzID0gMCkpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFjdGl2aXR5LCBwYXJ0bmVycyA9IGltcGxlbWVudGluZ19wYXJ0bmVycywgYmVuZWZpY2lhcmllcyA9IHVfYmVuLCBiZW5lZmljaWFyeV9mcmVxdWVuY2llcyA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KHBhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyeV9mcmVxdWVuY2llcyA9IHN1bShiZW5lZmljaWFyeV9mcmVxdWVuY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICByZXBsYWNlX25hKGxpc3QocGFydG5lcnMgPSAwLCBiZW5lZmljaWFyaWVzID0gMCwgYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMgPSAwLCBsb2NhdGlvbnMgPSAwKSkgJT4lIA0KICByZWxvY2F0ZShhZG1pbjNfcGNvZGUsIC5hZnRlciA9IElEUHMpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSAidG9wIiwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICAgImZ1bmN0aW9uKHNldHRpbmdzLCBqc29uKSB7IiwNCiAgICAgICAgICBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgICAgICAgICAifSIpDQogICAgICAgKSANCiAgICAgKSANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyA3LiBSZWZlcmVuY2UgbWFwIC0tIHRvd25zaGlwLWxldmVsDQoNCmBgYHtyIHJlZmVyZW5jZS1tYXAtZ2dwbG90bHksIGZpZy5oZWlnaHQ9MTB9DQoNCiMgSSB0aGluayB5b3UgbmVlZCB0byBjb2FsZXNjZSB0aGUgc3RhdGVzIGFuZCB0b3duc2hpcHMgd2l0aCBwY29kZTNfc2hhcGUgb3Igc3RhcnQgd2l0aCBwY29kZTNfc2hhcGUNCnRzcF9tYXAgPC0gcGNvZGUzX3NoYXBlICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoYWN0aXZpdHkpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4ocGluICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM19wY29kZSwgdG90YWxfcG9wLCBpZHBzLCBwaW5fMjAyMiksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gMC4xLA0KICAgICAgICAgIGFlcyhmaWxsID0gcGluXzIwMjIsDQogICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUElOIDIwMjI6ICIsIHBpbl8yMDIyLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcgY291bnQ6ICIsIHBhcnRuZXJzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3QgY291bnQ6ICIsIGFjdGl2aXRpZXMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGJlbmVmaWNpYXJpZXMpKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAidHVyYm8iLCB0cmFucyA9ICJsb2cxMCIpICsgDQogIGxhYnMoZmlsbCA9ICJQSU4gMjAyMiIsDQogICAgICAgdGl0bGUgPSAiTWFwIG9mIHRvd25zaGlwcyBieSAyMDIyIFBJTiIpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCg0KZ2dwbG90bHkodHNwX21hcCwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIHBsb3RseTo6c3R5bGUoaG92ZXJvbiA9ICJmaWxsIikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIk1hcCBvZiB0b3duc2hpcHMgYnkgMjAyMiBQSU4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSBvdmVyIGZvciBkZXRhaWxzOyBjbGljayBhbmQgZHJhZyB0byBzZWxlY3QgYW5kIHpvb20iLCI8L3N1cD4iKSkpDQpgYGANCg0K